我希望你能在C/C++中复制以下R函数:
fn1 = function(a, b) eval(a, b)
fn1(substitute(a*2), list(a = 1))
#[1] 2
我的前几次尝试导致出现错误(有时会崩溃),可能是因为我没有从列表对象中获取环境(我查看了R源代码,这时使用了一堆我认为我不能使用的内部函数),而且我认为这就是Rf_eval
所需的,而不是对象本身。
require(Rcpp)
require(inline)
fn2 = cxxfunction(signature(x = "SEXP", y = "SEXP"),
'return Rf_eval(x, y);')
fn2(substitute(a*2), list(a = 1))
# error, object 'a' not found
另一种尝试是调用基础R eval
,但是也出现了相同的错误:
require(Rcpp)
require(inline)
fn3 = cxxfunction(signature(x = "SEXP", y = "SEXP"),
'Function base_eval("eval"); return base_eval(x, y);',
plugin = 'Rcpp')
fn3(substitute(a*2), list(a = 1))
# again, object 'a' not found
每种方法都存在什么不足,我应该如何使它们都能够正常工作?
fn3
)不起作用? - eddiFunction::operator()
所致。请参见https://github.com/RcppTeam/Rcpp/blob/master/inst/include/Rcpp/Function.h#L78 - Romain Francoisdots
函数,并使用上下文获取未评估的参数,就像在https://dev59.com/F2Ik5IYBdhLWcg3wAJ2E#19711657中所示。 - Romain Francoisfn3(substitute(substitute(a*2)), list(a = 1))
是另一种解决方法。 - eddi