如何将变量名的字符向量转换为R中用逗号分隔的列表

时间:2014-06-06 20:58:38

标签: r

我有几个数据对象(三维数组),例如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的大小发生变化,这将毫无用处。

有什么想法吗?

2 个答案:

答案 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) )