【问题标题】:R: pass a vector of symbols into a function instead of a long argument listR:将符号向量传递给函数而不是长参数列表
【发布时间】: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 

【问题讨论】:

    标签: r arguments symbols


    【解决方案1】:

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

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

    【讨论】:

    • @ssdecontrol 是的——OP 在问题中说mySymbols 是一个列表。
    • 哇,这真的很酷!我什至可以将整个内容缩短为output = do.call(".C", c("my_dynlib", lapply(myNames, as.symbol)))。在我实际测试之前,我必须做更多的重写和调试,但是谢谢!
    猜你喜欢
    • 2019-03-20
    • 2021-06-21
    • 2012-06-19
    • 2020-01-13
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多