使用enquo时如何测试变量类型?

基督教百万

问题

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和其他博客中进行搜索。但是我可能很难知道要搜索什么。如果您能够指出正确的方向,我总是愿意自己弄清楚。任何其他资源都值得欢迎。

提前致谢!

弗里克先生

我会推荐这样的东西

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上下文中的安全性。您真的必须对它们进行评估,因为您真的不知道在评估之前它们中可能包含什么。然后,您可以检查所有结果的类。这也允许您执行这些变量的功能。这些都起作用。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

测试使用enquo()作为NULL参数的函数

将变量传递给使用 `enquo()` 的函数

使用 pandas-profiling 时如何更改变量类型?

在 TravisCI 上使用 Detox 进行测试时,如何获得写入变量/文件的测试(失败/通过)结果

如何使用rlang :: enquo调和.data代词

使用 Haskell 类型类时如何优雅地避免“歧义类型变量”

使用New-Variable函数创建变量时如何显式声明变量的类型?

使用 TABLE-FIELD 声明变量时如何找出变量的类型

如何将使用enquo()创建的动态变量名称传递给dplyr的mutate进行评估?

运行测试时,如何让Rails加载测试环境变量?

Ansible测试变量类型

使用Foreman时如何为测试和开发设置不同的环境变量

使用Jest测试框架调用fetch(url)时,如何基于url模拟变量响应?

运行测试时,如何获取emacs苹果酒(clojure模式)以使用测试环境变量?

如何使用类型对象测试SQL过程

如何测试泛型变量是否为AnyObject类型

你如何编写测试来检查特定类型的变量?

如何对类型为()=> void的变量进行单元测试

访问变量时如何使映射类型保留其类型?

如果接口变量的类型是别名,如何测试接口变量的基础类型

在使用列名而不是列索引加载数据集时如何定义变量类型?

当变量类型很明显时使用 Python 类型提示

如何使用符号创建类型级别列表以测试类型族

测试变量的类型或实例/值

如何设置全局环境变量时,单元测试

Mockito:如何在测试时模拟自动装配的变量

如何使用类型为<TSource>的变量

如何使用Type类型的变量作为Type?

如何定义不像类型那样使用的变量?