强制mapply返回列表?

Adr*_*ian 17 r mapply

假设我有一个创建数据帧的函数.我想用不同的输入值运行该函数,然后将结果整合到一个大数据框中,如下所示:

CreateDataFrame <- function(type="A", n=10, n.true=8) {
  data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type)
}
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame))
Run Code Online (Sandbox Code Playgroud)

我的CreateDataFrame函数有三个参数.在上面的示例中,第二个和第三个参数保持不变.我想像上面一样做,但每次调用都会改变第二个和第三个参数.我想我必须使用mapply,像这样:

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)
Run Code Online (Sandbox Code Playgroud)

我遇到了麻烦,因为mapply没有返回列表,这阻止了我运行do.call(rbind, mapply(...)).我怎么能得到一个数据框,就像我在顶部的例子中所做的那样?

看起来mapply正在返回一个列表矩阵.我期待它返回一个数据框列表.我该怎么办?

Jos*_*ien 29

为了得到data.frames作为返回值的列表,设置mapplySIMPLIFY参数FALSE.(它的默认值是TRUE,它将函数指向"尝试将结果减少为向量,矩阵或更高维数组" - 正如您所经历的那样).

res <- mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4, 
              SIMPLIFY = FALSE)

identical(class(res), "list")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • 它是如此愚蠢,以简化需要在资本.它的形式与sapply组功能不匹配 (9认同)
  • 没问题.我花了很长时间才得知每当我发现自己"如果函数X做Y会不会很好"时,函数的创建者就有可能击败我的想法! (3认同)
  • 谢谢!回想起来,我应该更仔细地阅读本手册. (2认同)

Wol*_* Wu 5

或者,您可以使用地图功能。它基本上是将SIMPLIFY设置为FALSE的映射。

Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)
Run Code Online (Sandbox Code Playgroud)

  • 我不知道!所以我查了一下代码,你说得很对。`&gt; 映射函数 (f, ...) { f &lt;- match.fun(f) mapply(FUN = f, ..., SIMPLIFY = FALSE) }` (3认同)