当前位置: 首页 > 知识库问答 >
问题:

如何创建同时支持引用和未引用参数的tidyverse函数?

盛承
2023-03-14

我知道如何创建函数来支持名为“变量”的参数的准引用{使用dplyr::e(变量)作为未加引号的函数参数}或需要您引用参数的函数{使用rlang::sym(变量)}。有没有一种简单的方法可以使函数既支持加引号又支持未加引号的参数?

例如,dplyr::select()允许select(mtcar, mpg)select(mtcar,"mpg")。构建一个可以做这两者的函数的最佳实践是什么?一个考虑因素是对数据屏蔽的影响,我不确定在构建更复杂的函数时是否需要考虑这一点。

我一直在github页面上寻找基本的dplyr函数,但是像select这样的简单函数依赖于一个全新的包(tidyselect),所以有很多事情要做。我在Tidy评估书中也没有看到明确的解释。下面是一个同时支持引用和未引用参数的hack函数,但这不是一个可靠的解决方案。我相信有一个更简单的方法。

library(dplyr)

data(mtcars)

test_func <- function(variable) {
  if(nrow(count(mtcars, {{variable}})) == 1) {
    variable <- rlang::sym(variable)
  }
  count(mtcars, {{variable}})
}

all_equal(
  test_func(cyl),
  test_func("cyl")
)

共有1个答案

拓拔富
2023-03-14

如果需要对引用/未引用都起作用,请使用< code>ensym

test_func <- function(variable) {  

    dplyr::count(mtcars, !!rlang::ensym(variable))    

  }

-测试

test_func(cyl)
#  cyl  n
#1   4 11
#2   6  7
#3   8 14
test_func('cyl')
#  cyl  n
#1   4 11
#2   6  7
#3   8 14

注意:最好将数据也作为函数的参数

 类似资料:
  • 问题内容: 我正在使用Linux,并且具有以下文件: 该函数在中声明和定义。我需要在中使用该函数,因此我将该函数声明为 在。 但是,在编译过程中,我得到了错误 怎么了? 谢谢。 预计到达时间:多亏了我收到的答案,我现在有了以下内容: 在fileA.h中,我有 在fileA.c中,我有 在fileB.h中,我有 在fileB.cpp中,我有 但是,我现在有错误 问题答案: 如果您确实是使用C而不是C

  • 许多编程语言中调用函数的两种方法是按值调用(call—by-value)和按引用调用(call—by—referrence)。参数按值调用传递时,生成参数值副本并传给被调用函数。副本的改变并不影响调用者的原始变量值,这样就可以防止意外的副作用影响开发正确、可靠的软件系统。本章前面的程序中 每个传递的参数都是按值调用传递的。 性能提示3.10 接值调用传递的一个缺点是,如果传递较大的数据项目,则复制

  • 问题内容: Postgres noobie在这里。 我正在尝试将SQL Server存储的proc转换为Postgres函数。当前无法弄清楚如何将此SQL行转换为Postgres。 SQL Server: Postgres: 我收到错误消息“第n列不存在”。如何在Postgres函数的select语句中引用参数? 更新: Postgres函数的定义 问题答案: 修订:正如评论中指出的那样,该答案在

  • 问题内容: 我有一个带几个参数的Python函数。在某些情况下,可以忽略其中一些参数。 这些参数通过是字符串,每个都有不同的含义。我可以选择要以任何组合形式传递的可选参数,这一点很重要。例如,或,,或,或所有它们(这些是我的选择)。 如果我可以重载该函数,那就太好了-但我读到Python不支持重载。我试图在列表中插入一些必需的int参数-并收到参数不匹配错误。 现在,我正在发送空字符串来代替前几个

  • 问题内容: 在代码中: 现在,将是7,x将是8。但是实际上,我想改变。我可以分配引用吗? 例如,在C ++中,可以达到以下目的: 现在,这两个&将是9 问题答案: 你不能。正如其他答案指出的那样,您可以(ab?)使用可变对象的别名来达到类似的效果。但是,这与C ++参考不是同一回事,我想解释一下为避免误解而实际发生的情况。 您会看到,在C ++(和其他语言)中,变量(以及对象字段以及集合中的条目等

  • 本文向大家介绍Oracle 如何创建和使用全文索引,包括了Oracle 如何创建和使用全文索引的使用技巧和注意事项,需要的朋友参考一下 不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR函数和LIKE操作符实现。   有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些文本定位的方法将导致全表扫描,对