如果你看一下代码,你会看到函数的一般结构:
function (.data, .variables, .fun = NULL, ..., .progress = "none",
.drop = TRUE, .parallel = FALSE)
{
.variables <- as.quoted(.variables)
pieces <- splitter_d(.data, .variables, drop = .drop)
ldply(.data = pieces, .fun = .fun, ..., .progress = .progress,
.parallel = .parallel)
}
<environment: namespace:plyr>
Run Code Online (Sandbox Code Playgroud)
所以它基本上以一种更容易使用的格式重新排列变量,然后将数据分成几部分,然后在这些部分上使用ldply.这些片段由函数splitter_d生成.Pieces实际上比列表更复杂 - 它是指向原始数据和索引列表的指针.无论何时请求列表的一部分,它都会查找匹配的索引并提取相应的数据.这避免了浮动数据的多个副本.您可以使用getAnywhere("splitter_d")或查看该功能的用法plyr:::splitter_d.
ldply在每个数据上传递一次.之后,它将所有内容组合回数据框.实际上,在ldply的帮助文件中写道:
所有plyr函数都使用相同的split-apply-combine策略:它们将输入分成更简单的部分,将.fun应用于每个部分,然后将这些部分组合成单个数据结构.此函数按元素拆分列表,并将结果合并到数据框中.如果没有结果,则此函数将返回零行和列的数据框(data.frame()).
我自己也说不出更好.奇迹,第一句话也可以在ddply的帮助页面上找到.