我正在尝试对包中的一个函数进行编程,但是我在内部使用match.call()
来解析该函数的一个参数。
具有通常用法的函数的超简化示例如下:
f1 = function(x, y=0, z=0, a=0, b=0){ #lots of arguments not needed for the example
mc = match.call()
return(mc$x)
#Returning for testing purpose.
#Normally, the function later uses calls as character:
r1 = as.character(mc$x[1])
r2 = as.character(mc$x[2])
#...
}
x1 = f1(x = foo(bar))
x1
# foo(bar)
class(x1)
# [1] "call"
就我而言,我需要从变量(以下代码中的x
)中获取value
的值。 f1
的预期利用率如下:
value = "foo(bar)" #this line could also be anything else
f1(x=some_magic_function(value))
# Expected result = foo(bar)
# Unwanted result = some_magic_function(value)
不幸的是,match.call()
总是返回非常输入的值。我在这里已经很出类拔萃了,所以我只尝试了几次功能。
有什么办法可以欺骗match.call()
以便它可以接受外部变量?
到目前为止失败的尝试:
#I tried to create the exact same call using rlang::sym()
#This may not be the best way...
value = call("foo", rlang::sym("bar"))
value
# foo(bar)
class(value)
# [1] "call"
x1==value
# [1] TRUE
f1(x=value)
# value
f1(x=eval(value))
# eval(value)
f1(x=substitute(value))
# substitute(value)
答案 0 :(得分:1)
没有任何内容可以作为f1
的参数来完成此工作。相反,您将需要动态地构建对f1
的调用。对于基数R,您可以使用do.call
来实现。
do.call("f1", list(parse(text=value)[[1]]))
或使用rlang
eval_tidy(quo(f1(!!parse_expr(value))))