R:将符号向量传递给函数而不是长参数列表

R: pass a vector of symbols into a function instead of a long argument list

我正在编写一个使用 .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 对象中的插槽怎么办?

假设我想使用引用数据帧中 class 个槽的符号。

> 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 

如果您有要传递给函数的对象列表,可以使用 do.call 函数来实现。在您的情况下,听起来以下内容应该有效:

do.call(".C", c("my_dynlib", mySymbols))