【发布时间】:2018-11-26 13:09:05
【问题描述】:
很简单的问题。
有没有办法避免
apply()中的简化?
我需要这样做,因为我有一个 apply,它有时可以简化(它确实做到了)有时不能,因此根据输入创建不同的数据结构,所以我想完全避免它。
我需要类似于mapply() 中的SIMPLIFY = FALSE 的东西,或者像vapply() 中那样控制输出的机制。
简单的可重现示例:
mimat <- matrix(c(1,2,3,4,5,6), nrow = 2)
mimat2 <- matrix(c(3,2,3,4,5,6), nrow = 2)
apply(mimat, MARGIN = 2, function(x) {
if (is.element(el = 1, x)) return(c(0,1))
else return(c(1,2,3))
})
如果apply() 应用于mimat,它会输出一个列表,而如果它应用于mimat2,它会输出一个矩阵。
【问题讨论】:
-
你应该提供一个例子。您可以在这里寻找可能的解决方案:purrr.tidyverse.org
-
简短回答:不,没有。将
apply与可能返回可变长度向量的函数一起使用是危险的。for循环要好得多(或者将矩阵强制转换为 data.frame,然后在可行的情况下调用lapply)。 -
您可以将返回向量包装在
list中,如下所示:return(list(c(0,1))),然后您将始终得到一个列表。 -
@JohnPaul 如果你这样做,你会得到一个列表列表,这是一些东西,但仍然不是我想要的。无论如何,我想我会避免使用
apply()。