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))
我正在编写一个使用 .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))