我想从函数向C/C传递一个可变数量的参数,但希望不对参数求值,同时不想在R中进行任何计算(除了调用C/C函数)。我不想在R函数中调用substitute
。我认为可以使用的一个选项是.External
,并像这样执行smth:
R_fn = function(...) .External("cpp_fn", ...)
...
# and in C code:
SEXP cpp_fn (SEXP arglist) {
}
但是,.External
正在计算...
中的参数,因此如果我尝试类似
rm(x, y) # just making sure these don't exist
R_fn(x*y)
我得到一个错误,因为R试图在 * 将x*y
* 发送到函数之前计算它。
下面的代码在R中工作:
f = function(...) g(...)
g = function(x, ...) print(substitute(x))
f(x*y*z)
# x * y * z
我还有其他选择吗?很明显,可以像R本身那样处理许多函数,例如。例如substitute
本身,但我不知道如何做到这一点。我添加了rcpp
标记,因为我最终会在Rcpp
中使用它。
2条答案
按热度按时间q3aa05251#
一种可能性是做
match.call
所做的事情(感谢Ricardo Saporta为我指明了方向)。这需要从R源代码中复制粘贴一些定义,我在这里不会这样做,但基本思想是从R_GlobalContext
中获取调用函数,然后从中提取函数参数。草图如下:i2loujxw2#
我已经成功地使用了
.External2
接口,并在R Package 器的环境中查找了未评估的promise。没有彻底测试,但节省了我几百纳秒与交换了R级substitute()
和match.call()
。在R中:
在C中: