R 中奇怪的 apply() 行为返回具有不同值范围的不同值,甚至当函数单独输入时?

Strange apply() behavior in R returning different values with different value ranges and even when function entered alone?

见过这种行为吗?为什么?

我先总结一下我的问题,然后再澄清一下: 我有一个有效的函数“my_function()”。当我单独使用它时,它总是有效。 当我在其上使用 apply() 时,有时会得到错误的输出。示例:

apply(working_data[933266:933267,], 1, my_function) 让我得到不需要的 NA。 apply(working_data[933265:933266,], 1, my_function) 工作正常。 apply(working_data[933267:933268,], 1, my_function) 工作正常。

为什么 apply() 会这样?

我会澄清更多:

我有一个工作正常的函数,它 returns 对我来说是一个命名的逻辑向量。

我将给出一个输出示例:

my_function(working_data[933267,])

 320170356871 174173601732 172156573581 320004381381 320210363581 ...
     FALSE        FALSE        FALSE        FALSE        FALSE    ...

my_function(working_data[933266,])

 320170356871 174173601732 172156573581 320004381381 320210363581 ...
     FALSE        FALSE        FALSE        FALSE        FALSE    ...

好的,这是正确的(没有 NA,并且两个示例之间的输出不同,我检查过,不要被那些重复的 FALSE 骗了你)。

现在我想将它应用于数据框的行。每当我这样做时,它都会工作一段时间,然后突然开始到处返回 NAs 并且永远! (请注意,我将使用与上面相同的索引):

apply(working_data[933266:933267,], 1, my_function)

 |     |933266 |  933267|
 |-----|-------|--------|
 |[1,] |FALSE  |  NA    |
 |[2,] |FALSE  |  NA    |
 |[3,] |FALSE  |  NA    |
 |[4,] |FALSE  |  NA    |
 |[5,] |FALSE  |  NA    |
 |...  |  ...  |   ...  | 

这是我看到的。事实上,我得到的是 933266 左边的所有内容(即从 1 到 933266)都是正确的,而 933267 右边的所有内容都是 NA。

预期的输出是这样的:

 |     |933266 |  933267|
 |-----|-------|--------|
 |[1,] |FALSE  |  FALSE |
 |[2,] |FALSE  |  FALSE |
 |[3,] |FALSE  |  FALSE |
 |[4,] |FALSE  |  FALSE |
 |[5,] |FALSE  |  FALSE |
 |...  |  ...  |   ...  | 

请注意,当我尝试 apply(working_data[933265:933266,], 1, my_function)apply(working_data[933267:933268,], 1, my_function) 时,我得到了正确的结果!

所以它只为那个时间间隔返回 NA:apply(working_data[933266:933267,], 1, my_function)

我似乎不明白为什么!

另请注意,当 运行 一个 for 循环时,我 总是 得到正确的结果。

对此是否有任何理论解释(希望不需要提供可重现的示例。我的代码太深了)?

提前致谢

所以我解决了。问题是数据集中的一个值有一个尾随空格,并被传递给函数的参数之一。

当我单独(或通过 for 循环)应用该函数时,R 似乎自动处理了尾随空格并忽略了它。

此外,当从包含尾随空格的值(在我的例子中是第 933267 行)启动 apply() 函数时,apply() 不会检测到它,也不会抛出 NA 或错误,只会继续通常..这解释了为什么我用 apply(working_data[933267:933268,], 1, my_function)

得到干净的结果

但是,当具有尾随空格的值位于值范围的中间时(即不是第一个值),该函数将显示上述行为,并将 return 那些令人困惑的 NA。这解释了 apply(working_data[933266:933267,], 1, my_function)

中的不良结果

我希望它更一致; apply() 应该抛出 NA,即使第一个值中有尾随空格(即当我调用 apply(working_data[933267:933268,], 1, my_function) 时)。如果这样做,我会更早发现这一点。