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出错。
当运行代码
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出错。