R:在 0 x 0 矩阵上调用 apply 会导致调用 FUN(numeric(0))。为什么?这可以预防吗?

R: Calling apply on a 0 x 0 matrix results in calling FUN(numeric(0)). Why? And can this be prevented?

当运行代码

f = function(x) print(x)
apply(matrix(numeric(0),0,0), 1, f)

我的期望是什么都不打印;有零行要应用 f,因此永远不应该调用 f。相反,f 被调用一次,并打印 numeric(0),表明 apply 在某个时候调用 f(numeric(0))(或等效)。

这是激发这个问题的(非 MWE)代码中的一个问题,因为如果给定数字(0)作为参数,我的实际 FUN 会崩溃。

为什么会这样?是否有一个参数可以提供给 apply 以使其不存在?在这种特殊情况下,我可以解决它(具体来说,通过将相关代码放入 if 块中),但似乎应该有更好的解决方案。

如果你想阻止函数被调用,你需要某种 if 语句来检查值,然后再将它传递给 apply

如果在调用函数之前通过 运行 debugonce(apply) 单步执行 apply 函数,您可以看到 apply 专门编写为始终调用 FUN 即使在空白页边距的情况下。对于某些函数,零长度向量可能是完全有效的输入。这不是 apply 的决定,也没有任何选择。这与 apply 中 return 的值描述一致,如 ?apply 帮助页面的“值”部分所述。

另一种方法是更改​​您的函数,如果传递的是零长度向量,它不会return出错。