我遇到了一个奇怪的行为R http://en.wikipedia.org/wiki/R_%28programming_language%29与sapply()
功能。该函数应该返回一个向量,但在给它一个空向量的特殊情况下,它会返回一个列表。
向量的正确行为:
a = c("A", "B", "C")
a[a == "B"] # Returns "B"
a[sapply(a, function(x) {x == "B"})] # Returns "B"
NULL 值的正确行为:
a = NULL
a[a == "B"] # Returns NULL
a[sapply(a, function(x) {x == "B"})] # Returns NULL
空向量的奇怪行为:
a = vector()
a[a == "B"] # Returns NULL
a[sapply(a, function(x) {x == "B"})] # Erreur : type 'list' d'indice incorrect
与此语句相同的错误消息:
a[list()] # Erreur dans a[list()] : type 'list' d'indice incorrect
为什么?这是一个错误吗?
由于这种奇怪的行为,我使用unlist(lapply())
.
真正的原因是sapply
不知道你的函数在不调用它的情况下会返回什么。在你的情况下,该函数返回一个logical
, 但是由于sapply
给出一个空列表,该函数永远不会被调用。因此,它必须想出一个类型,并且默认为list
.
...正是出于这个原因(以及性能),vapply
被介绍了!它要求您指定返回值类型(和长度)。这使得它能够做正确的事情。作为奖励,它也更快!
sapply(LETTERS[1:3], function(x) {x == "B"}) # F, T, F
sapply(LETTERS[0], function(x) {x == "B"}) # list()
vapply(LETTERS[1:3], function(x) {x == "B"}, logical(1)) # F, T, F
vapply(LETTERS[0], function(x) {x == "B"}, logical(1)) # logical()
See ?vapply
了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)