【发布时间】:2020-03-05 09:47:49
【问题描述】:
我正在为我的同事创建一个函数来轻松分析一些预先指定的数据集。我希望他们能够将“i”参数传递给选择行。为了使它更健壮,我希望能够使用或不使用引号来传递这个参数。
这是一个使用引号的示例......
x <- data.table(x = c(1,1,1,2,2,2,3,3,3),
sex = c("M", "M", "F","M", "F","M", "F","M", "F"))
test.function <- function(my.dt, ...){
where <- parse(text = paste0(list(...)))
my.dt <- my.dt[eval(where), ]
return(my.dt)
}
tmp <- test.function(x, 'x==3 | sex=="F"')
head(tmp)
如果我删除引号,它会说“找不到对象'sex'”......
x <- data.table(x = c(1,1,1,2,2,2,3,3,3),
sex = c("M", "M", "F","M", "F","M", "F","M", "F"))
test.function <- function(my.dt, ...){
where <- parse(text = paste0(list(...)))
my.dt <- my.dt[eval(where), ]
return(my.dt)
}
tmp <- test.function(x, x==3 | sex=="F")
head(tmp)
除了上述之外,我还多次尝试使用引号、替换和 rlang 失败:就像这个失败的例子……
x <- data.table(x = c(1,1,1,2,2,2,3,3,3),
sex = c("M", "M", "F","M", "F","M", "F","M", "F"))
test.function <- function(my.dt, ...){
where <- rlang::quos(...)
my.dt <- my.dt[!!where, ]
return(my.dt)
}
tmp <- test.function(x, 'x==3 | sex=="F"')
head(tmp, 10)
除了对解决方案的任何想法之外,如果有人能将我指向一个简单的在线资源以了解符号/表达式/引号/等,我将不胜感激。当我深入研究这个问题时,我意识到我在理解 R 的工作原理方面存在一些严重的差距。
顺便说一句,我已经阅读了以下内容,但都无法帮助我:Passing function argument to data.table i 和 Passing multiple arguments to data.table inside a function .
【问题讨论】:
-
如何将 x、sex 和运算符作为单独的参数传递? test.function(x, 3, "F", "|")。然后设置你的函数来处理每个输入作为一个单独的变量?
-
感谢您的评论克里斯。我试图让最终用户尽可能简单,因为他们不会是熟练的 R 用户。这就是为什么我希望我希望他们能够使用或不使用引号来传递参数。再次感谢。
-
如果您删除引号,则不应再使用 parse。 Parse 需要字符,而不是表达式。
-
谢谢@jangorecki。在看到马特的解决方案后,我明白了。
标签: r function data.table parameter-passing