Map vs Mapply - Mapply的意外行为

时间:2015-12-24 17:11:57

标签: r mapply

我有一个函数列表和一个数据帧列表(所有函数都返回一个绘图对象)。我想将i th 函数应用于i th 数据集。我尝试使用mapply,如下所示:

mapply(function(f,x) f(x), list_functions, list_datasets)

当我尝试这个时,我会得到意想不到的东西。这是输出的样子:

 data        List,7 List,3      List,7
 layers      List,1 List,3      List,2
 scales      ?      ?           ?     
 mapping     List,3 List,3      List,4
 theme       List,0 List,0      List,0
 coordinates List,1 List,1      List,1
 facet       List,7 List,1      List,1
 plot_env    ?      ?           ?     
 labels      List,3 List,4      List,4

当然,当然,我想要的是要返回的绘图对象列表。

然后我尝试了这个:

Map(function(f,x) f(x), list_functions, list_datasets)

这次我获得的输出正是我想要的 - 一个图表列表。

所以,虽然问题已经解决,但我非常想知道为什么mapply表现得像这样。

任何指针?

谢谢& Merry x-mas !!

1 个答案:

答案 0 :(得分:3)

mapply的默认行为是尽可能简化输出。如果要覆盖该行为,请在命令中添加SIMPLIFY = FALSE

这演示了行为(我无权访问您的函数或数据,因此我无法重新创建您在此处共享的内容)。

由于输出是可以简化的,因此结果将是矩阵:

> mapply(rep, 1:4, 4)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
[3,]    1    2    3    4
[4,]    1    2    3    4

覆盖该行为:

> mapply(rep, 1:4, 4, SIMPLIFY = FALSE)
[[1]]
[1] 1 1 1 1

[[2]]
[1] 2 2 2 2

[[3]]
[1] 3 3 3 3

[[4]]
[1] 4 4 4 4

您仍然可以使用标准[row, col]类型的方法访问输出中的项目。