gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:56:46 24 4
gpt4 key购买 nike

我正在编写一个 R 包,它使用 .C() 函数调用 C 代码。我需要将 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

最佳答案

如果您有要传递给函数的对象列表,则可以使用 do.call 函数来执行此操作。就您而言,听起来以下内容应该有效:

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

关于R:将符号向量传递给函数而不是长参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com