【发布时间】:2015-08-13 17:29:27
【问题描述】:
我正在编写一个使用 .C() 函数调用 C 代码的 R 包。我需要将 50 多个参数传递到 .C() 中,这会使我的代码严重膨胀并且容易出错。而不是输入
output <- .C("my_dynlib", arg2, arg3, arg4, arg5, arg6, ..., arg53)
我宁愿有一个附加参数的字符向量 myNames 发送到 .C() 并执行类似的操作
f <- Vectorize(as.symbol, "x")
mySymbols <- f(myNames)
output <- .C("my_dynlib", mySymbols)
但这不是我想要的,因为 mySymbols 是一个列表。有没有办法将一组参数紧凑地传递给我不想重写的函数?
脚注:我猜你们中的一些人会建议使用 .Call、.External 或 Rcpp 传递更复杂的参数,但这比我现在想要处理的要大。
编辑:如果我希望 myNames 指向 s3 或 s4 对象中的插槽怎么办?
假设我想使用引用数据帧中类槽的符号。
> y = data.frame(a = 1:4, b = 5:8)
> myNames = paste("y@", slotNames(y), sep = "")
> mySymbols = lapply(myNames, as.symbol)
> str(mySymbols)
List of 4
$ : symbol y@.Data
$ : symbol y@names
$ : symbol y@row.names
$ : symbol y@.S3Class
我像@josilber 所说的那样使用 do.call,但是 do.call 无法识别符号
> do.call(print, mySymbols)
Error in (function (x, ...) : object 'y@.Data' not found
即使我可以手动使用这些符号。
> y@.Data
[[1]]
[1] 1 2 3 4
[[2]]
[1] 5 6 7 8
【问题讨论】: