r 함수 왜 sapply()가 목록을 반환합니까?




tapply in r (3)

나는 sapply() 함수로 R 에서 이상한 행동을 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()) 합니다.


실제로, 그들은 둘 다 list 돌려 보낸다. 둘 사이의 유일한 차이점은 NULL 을 인덱스하려고 할 때 인덱스가 목록 인 경우에도 항상 NULL 을 반환하지만 빈 벡터를 인덱싱하려고하면 인덱스를 검사하여 list 임을 깨닫는 것입니다.

a = NULL
res = sapply(a, function(x) x == "B") # Res is an empty list
a[res] # returns NULL, because any index of NULL is NULL.


a = vector()
res = sapply(a, function(x) x == "B") # Still an empty list.
a[res] # but you can't index a vector with a list!

함수에 대한 도움말은 ?sapply 섹션에 있습니다.

For ‘sapply(simplify = TRUE)’ and ‘replicate(simplify = TRUE): if
‘X’ has length zero or ‘n = 0, an empty list.

두 경우 모두 :

> length(NULL)
[1] 0
> length(vector())
[1] 0

따라서 sapply() 는 다음을 반환합니다.

> sapply(vector(), function(x) {x == "B"})
list()
> sapply(NULL, function(x) {x == "B"})
list()

당신의 오류는 sapply() 에서 sapply() 것이 아니라 [ 과 같이] :

> a[list()]
Error in a[list()] : invalid subscript type 'list'

따라서 문제는 NULL 과 빈 벡터 ( vector() )의 부분 집합이 수행되는 방법과 관련이 있습니다. sapply() 와 전혀 관련이 없습니다. 두 경우 모두 일관된 결과를 반환하고 빈 목록을 반환합니다.


이것에 대한 진정한 이유는 sapply 가 함수를 호출하지 않고 반환 할 함수를 모른다는 것입니다. 귀하의 경우 함수는 logical 반환하지만, sapply 는 빈 목록이 주어지기 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()

자세한 정보는 ?vapply 를 참조하십시오.







r