我遇到了一个使用substitute
函数解析其函数之一中的参数的程序包。
使用的功能大致如下:
f <- function(...) {
ref <- as.list(substitute(list(...))[-1])
# for clarity
print(ref)
counter <- 0L
for (i in ref) {
if (as.character(i[1]) == "==") {
counter <- counter + 1L
}
}
return(counter)
}
f(df1$a == df1$b, df1$b == df1$c)
#> [[1]]
#> df1$a == df1$b
#>
#> [[2]]
#> df1$b == df1$c
#> [1] 2
由reprex package(v0.3.0)于2019-10-24创建
我想将df1$a == df1$b, df1$b == df1$c
作为字符传递,但是由于无法覆盖substitute
函数,因此无法找到一种方法。到目前为止,我已经尝试了一些选项,但是似乎都不起作用:
char <- "df1$a == df1$b, df1$b == df1$c"
f(get(char))
#> [[1]]
#> get(char)
#> [1] 0
f(parse(text = char))
#> [[1]]
#> parse(text = char)
#> [1] 0
f(eval(parse(text = char)))
#> [[1]]
#> eval(parse(text = char))
#> [1] 0
由reprex package(v0.3.0)于2019-10-24创建
编辑:
在@Roland回答了我的第一个问题之后,我想知道是否还有一种简单的方法来解决使用另一个参数的函数的一般情况:
f2 <- function(parameter, ...) {
ref <- as.list(substitute(list(...))[-1])
# for clarity
print(ref)
counter <- 0L
for (i in ref) {
if (as.character(i[1]) == "==") {
counter <- counter + 1L
}
}
return(counter)
}
答案 0 :(得分:2)
您不能脱离substitute
。这是不可能的,因为未评估函数参数。但是您可以这样做:
char <- "df1$a == df1$b, df1$b == df1$c"
#turn char into list of language objects
char <- strsplit(char, ",", fixed = TRUE)[[1]]
char <- as.list(parse(text = char))
#pass to f
do.call(f, char)
#[[1]]
#df1$a == df1$b
#
#[[2]]
#df1$b == df1$c
#
#[1] 2