【问题标题】:How to test variable type when using enquo?使用 enquo 时如何测试变量类型?
【发布时间】:2018-07-10 00:20:49
【问题描述】:

问题

在将自定义函数的enquo 参数传递给dplyr 链之前,我想确保它的类型正确。

我的尝试

我能够将参数组合成dataframe,然后然后测试每个变量的类型。但我想知道是否有一种解决方案可以在将每种类型放入dataframe 之前对其进行测试?

我也试过了,没用:

my_function_if <- function(data, numeric_arg, logic_arg, chr_arg){

  if(is.numeric(data$numeric_arg)){
    enq_numeric <- enquo(numeric_arg)
  } else {
    warning("Argument \"numeric_arg\" must be numeric")
  }

  if(is.logical(data$logic_arg)){
    enq_logic <- enquo(logic_arg)
  } else {
    warning("Argument \"logic_arg\" must be logical")
  }

  if(is.character(data$chr_arg)){
    enq_chr <- enquo(chr_arg)
  } else {
    warning("Argument \"chr_arg\" must be of type character")
  }

  df <- data %>%
        mutate(numeric_col2 = UQ(enq_numeric)*2,
               logic_col2 = !UQ(enq_numeric),
               chr_col2 = UQ(enq_chr))

  return(df)
}

样本数据和样本函数

这是我用来测试使用 enquo 评估列的一般概念的方法:

library(dplyr)

dataFrame <- data.frame(numeric_col = c(1.5:10.5),
                        logic_col = c(rep(T, 10)),
                        chr_col = c(letters[1:10]),
                        stringsAsFactors = FALSE)

my_function <- function(data, numeric_arg, logic_arg, chr_arg){


  enq_numeric <- enquo(numeric_arg)
  enq_logic <- enquo(logic_arg)
  enq_chr <- enquo(chr_arg)


  df <- data %>%
        mutate(numeric_col2 = UQ(enq_numeric)*2,
               logic_col2 = !UQ(enq_numeric),
               chr_col2 = UQ(enq_chr))

  return(df)
}

正确的输出没有任何错误: (虽然我正在寻找更通用的解决方案,因为这是一个示例函数)

   numeric_col logic_col chr_col numeric_col2 logic_col2 chr_col2
1          1.5      TRUE       a            3      FALSE        a
2          2.5      TRUE       b            5      FALSE        b
3          3.5      TRUE       c            7      FALSE        c
4          4.5      TRUE       d            9      FALSE        d
5          5.5      TRUE       e           11      FALSE        e
6          6.5      TRUE       f           13      FALSE        f
7          7.5      TRUE       g           15      FALSE        g
8          8.5      TRUE       h           17      FALSE        h
9          9.5      TRUE       i           19      FALSE        i
10        10.5      TRUE       j           21      FALSE        j

另外

我尝试在 Hadley 的许多资源、StackOverflow 和其他博客中搜索此内容。但我可能只是很难知道要搜索什么。如果你能指出我正确的方向,我总是愿意自己弄清楚。任何其他资源都非常受欢迎。

谢谢,提前!

【问题讨论】:

    标签: r dplyr tidyeval


    【解决方案1】:

    我会推荐这样的东西

    check_class <- function(data, q, test) {
      test(rlang::eval_tidy(q, data))
    }
    
    my_function <- function(data, numeric_arg, logic_arg, chr_arg){
    
      enq_numeric <- enquo(numeric_arg)
      enq_logic <- enquo(logic_arg)
      enq_chr <- enquo(chr_arg)
    
      stopifnot(check_class(data, enq_numeric, is.numeric))
      stopifnot(check_class(data, enq_logic, is.logical))
      stopifnot(check_class(data, enq_chr, is.character))
    
      df <- data %>%
        mutate(numeric_col2 = UQ(enq_numeric)*2,
               logic_col2 = !UQ(enq_numeric),
               chr_col2 = UQ(enq_chr))
    
      return(df)
    }
    

    我们使用rlang::eval_tidy 来评估data.frame 上下文中的quosures。你真的必须评估它们,因为在你评估之前你真的不知道它们里面可能有什么。然后你可以检查任何出来的类。这也允许您执行这些变量的函数。这两个都有效。

    my_function(dataFrame, numeric_col, logic_col, chr_col)
    my_function(dataFrame, as.numeric(logic_col), logic_col, as.character(logic_col))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 2022-06-21
      • 2017-08-06
      • 2017-01-02
      • 2019-03-21
      • 2015-12-21
      相关资源
      最近更新 更多