我正在为我的同事创建一个函数,以轻松分析一些预先指定的数据集。我希望他们能够传递“ 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)
除了任何解决方案的想法,如果有人可以将我引向simpleton的在线资源以理解符号/表达式/引号/等,我将不胜感激。当我研究这个问题时,我意识到我在理解R的工作原理上存在一些严重的差距。
顺便说一句,我已经阅读了以下内容,但都无法帮助我:Passing function argument to data.table i和Passing multiple arguments to data.table inside a function。
可能还有其他(更好的)选项,但是您可以将其包装在tryCatch
中,并在未引用的位置使用bquote
test.function <- function(my.dt, ...){
where <- tryCatch(parse(text = paste0(list(...))), error = function (e) parse(text = paste0(list(bquote(...)))))
my.dt <- my.dt[eval(where), ]
return(my.dt)
}
tmp <- test.function(x, 'x==3 | sex=="F"')
head(tmp)
x sex
1: 1 F
2: 2 F
3: 3 F
4: 3 M
5: 3 F
tmp <- test.function(x, x==3 | sex=='F')
head(tmp)
x sex
1: 1 F
2: 2 F
3: 3 F
4: 3 M
5: 3 F