【发布时间】:2018-01-30 13:46:47
【问题描述】:
我需要将... 转发到函数参数,将符号提取为代码,并将它们转换为字符,同时保留名称。我通常为此使用match.call(expand.dots = FALSE)$...,但它破坏了!! 运算符。
当前行为
f <- function(...){
match.call(expand.dots = FALSE)$...
}
f(a = 1234, b = !!my_variable)
## $a
## [1] 1234
##
## $b
## !(!my_variable)
期望的行为
f <- function(...){
# whatever works
}
f(a = 1234, b = !!my_variable)
## $a
## [1] 1234
##
## $b
## !!my_variable
编辑更好:
f <- function(...){
# whatever works
}
my_variable <- "my value"
f(a = 1234, b = !!my_variable)
## $a
## [1] 1234
##
## $b
## [1] "my_value"
【问题讨论】:
-
这会影响哪些下游后果? R 语言本身没有合适的
!!运算符。rlang包将双重函数调用解释为特殊的含义,但如果使用默认解析器解析它,则会得到双重否定。 -
跟进 MrFlick 的解决方案是简单地检查
quoted的值是否为 double !并单独处理该案件 -
@MrFlick,我想保留稍后评估
!!的选项。我也愿意像上面的编辑一样立即评估!!。从@lionel 最近的网络研讨会(我假设他是同一个 Lionel)中,我记得这在rlang中是可能的,但我不记得如何了。 -
没关系:我认为
f <- function(...){rlang::exprs(...)}工作得很好。 @MrFlick,如果您发布该答案,我会接受。你把我推向了正确的方向。 -
其实我想看看你是怎么用的。我自己没有使用过这个功能。如果您发布自己的答案,我很乐意投票。