【问题标题】:How to use a 'list' object when a '...' argument is required?当需要“...”参数时如何使用“列表”对象?
【发布时间】:2014-03-12 19:13:22
【问题描述】:

在许多 R 函数中,... 参数用于提供多个对象。如何在 ... 参数中提供 list 对象?

例如:

x1 <- head(iris)
x2 <- tail(iris)
rbind(x1, x2)
#    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#1            5.1         3.5          1.4         0.2    setosa
#2            4.9         3.0          1.4         0.2    setosa
#3            4.7         3.2          1.3         0.2    setosa
#4            4.6         3.1          1.5         0.2    setosa
#5            5.0         3.6          1.4         0.2    setosa
#6            5.4         3.9          1.7         0.4    setosa
#145          6.7         3.3          5.7         2.5 virginica
#146          6.7         3.0          5.2         2.3 virginica
#147          6.3         2.5          5.0         1.9 virginica
#148          6.5         3.0          5.2         2.0 virginica
#149          6.2         3.4          5.4         2.3 virginica
#150          5.9         3.0          5.1         1.8 virginica

但假设我在list 中有x1x2 数据帧。如何在rbind 中将list... 参数一起使用?

我已经尝试了以下方法,但没有成功:

rbind(list(x1, x2))
rbind(substitute(list(x1, x2))[-1])
rbind(unlist(list(x1, x2)))

在每种情况下,结果都与rbind(x1, x2) 不同。我错过了什么?

更新1
正如答案中所建议的那样,do.call(rbind, list(x1, x2)) 在这种情况下似乎工作得很好。但是,我想知道是否可以避免使用do.call 机器。换句话说,是否可以转换list(x1, x2) 以便... 正确理解它?

【问题讨论】:

  • do.call 是一个很棒的功能,当你说你无缘无故地想避免它时,我相信你已经伤害了它的感受。我也不明白你为什么认为rbind(list) 会起作用。正如你所说,rbind... 中有几个对象。列表是单个对象。
  • @rawr 无意冒犯。 :) 至于list,它是几个对象的集合。我希望类似于unlist(list) 的技巧会自动将几个嵌入对象传递给rbind()

标签: r list arguments ellipsis variadic-functions


【解决方案1】:

do.call 是您在这种情况下使用的。

df1 <- head(iris)
df2 <- tail(iris)
l <- list(df1, df2)

do.call(rbind, l)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 1            5.1         3.5          1.4         0.2    setosa
## 2            4.9         3.0          1.4         0.2    setosa
## 3            4.7         3.2          1.3         0.2    setosa
## 4            4.6         3.1          1.5         0.2    setosa
## 5            5.0         3.6          1.4         0.2    setosa
## 6            5.4         3.9          1.7         0.4    setosa
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica

【讨论】:

  • 这非常有效。但我想知道是否有可能避免do.call机械?
  • @landroni 为什么要避免它?
  • 我猜这不是好的原因。我想知道这是否可以做到。
【解决方案2】:

plyr 有一个函数可以将其他函数转换为接受列表作为参数的形式。它基本上只是do.call 的包装,但如果这是你经常做的事情,你可以定义自己的自定义函数:

library(plyr)
rbindl <- splat(rbind)
lst <- list(head(iris, 3), tail(iris, 3))
rbindl(lst)
#     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1            5.1         3.5          1.4         0.2    setosa
# 2            4.9         3.0          1.4         0.2    setosa
# 3            4.7         3.2          1.3         0.2    setosa
# 148          6.5         3.0          5.2         2.0 virginica
# 149          6.2         3.4          5.4         2.3 virginica
# 150          5.9         3.0          5.1         1.8 virginica

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多