我有几个数据对象(三维数组),例如object1,object2,object3。
这些对象列在字符向量中:
char <- c("object1","object2","object3")
然后,我需要获取在一个函数中使用的对象列表,该函数要求用逗号分隔输入:
output <- FancyFunction(object1,object2,object3,OtherFancyStuff)
当我更改代码的上面一行时,如何让R自动更改下面一行代码?我希望能够添加或删除&#34; char&#34;中的对象。并在&#34;输出&#34;中相应地改变。
我不知道该怎么做。我能做的最好的事情是:
output <- FancyFunction(get(char[1]),get(char[2]),get(char[3]),OtherFancyStuff)
但如果char的大小发生变化,这将毫无用处。
有什么想法吗?
答案 0 :(得分:4)
我认为这样的事情会起作用:
char <- c("object1","object2","object3")
## 2-d objects for illustration as I couldn't think of an array
## function that took arbitrary input vectors `...`
object1 <- object2 <- object3 <- array(1:25, dim = c(5,5))
do.call("rbind", mget(char))
给出了
> do.call("rbind", mget(char))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
[6,] 1 6 11 16 21
[7,] 2 7 12 17 22
[8,] 3 8 13 18 23
[9,] 4 9 14 19 24
[10,] 5 10 15 20 25
[11,] 1 6 11 16 21
[12,] 2 7 12 17 22
[13,] 3 8 13 18 23
[14,] 4 9 14 19 24
[15,] 5 10 15 20 25
要传入额外的参数,您需要通过连接mget(char)
返回的对象上的其他参数来稍微修改它,例如:
c(mget(char), list(arg1 = "foo", arg2 = "bar", arg3 = 1:10))
> c(mget(char), list(arg1 = "foo", arg2 = "bar", arg3 = 1:10))
$object1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
$object2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
$object3
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
$arg1
[1] "foo"
$arg2
[1] "bar"
$arg3
[1] 1 2 3 4 5 6 7 8 9 10
其中arg1
等对应FancyFunction
所需的其他参数,需要根据您希望这些参数在FancyFunction
的定义中映射到的形式参数进行命名。该调用将类似于:
OtherFancyStuff <- list(arg1 = "foo", arg2 = "bar", arg3 = 1:10)
do.call("FancyFunction", c(mget(char), OtherFancyStuff)
FancyFunction
需要3个参数还是第一个参数...
?如果您可以控制它,则可能值得重写FancyFunction
以...
作为第一个参数,并从中提取各种参数,现在可以提供任意数量的参数:
FancyFunction <- function(..., other) {
dots <- list(...)
## work on components of 'dots', the length of which is number of args
## provided as ...
....
return()
}
答案 1 :(得分:2)
函数do.call
让你通过传递参数值列表来调用函数。在这种情况下,您只需要创建要传递的对象列表和任何其他参数。
由于您已经拥有了要包含在字符向量形式中的对象的名称,因此函数mget()
将返回具有这些名称的对象列表,以便部分容易。您只需添加其他参数即可。
所以你可以用
来调用你的函数do.call( FancyFunction, c(mget(char),OtherFancyStuff) )