【发布时间】:2019-10-24 07:19:15
【问题描述】:
我遇到了一个包,它使用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)
}
【问题讨论】:
-
只要
do.call(f2, c(list(parameter = somevalue), char))。 -
@Roland 非常感谢您再次及时回复。我从未使用过
substitute,也很少使用do.call。它非常适合这种情况。
标签: r