답변:
Map
다른 언어의 map과 비슷한 함수 가 있습니다.
lapply
X와 동일한 길이의 목록을 리턴합니다. 각 요소는 FUN을 X의 해당 요소에 적용한 결과입니다.
do.call
이름이나 함수 및 전달할 인수 목록에서 함수 호출을 구성하고 실행합니다.
Map
주어진 벡터의 해당 요소에 함수를 적용합니다 ... Common Lisp의 mapcar와 비슷하지만 결과를 단순화하려고 시도하지 않는 Map
간단한 래퍼입니다 mapply
(그러나 인수는 재활용됩니다). 이후 버전에서는 결과 유형을 일부 제어 할 수 있습니다.
Map
래퍼입니다 mapply
lapply
특별한 경우입니다 mapply
Map
그리고 lapply
많은 경우에 유사합니다.예를 들면 다음과 같습니다 lapply
.
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
그리고 같은 사용 Map
:
Map(class, iris)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
do.call
함수를 입력으로 취하고 다른 인수를 함수에 뿌립니다. 예를 들어, 목록을 더 간단한 구조 (종종 rbind
또는로 cbind
) 로 어셈블하는 데 널리 사용됩니다 .
예를 들면 다음과 같습니다.
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call(cbind, x)
버전이 현재 버전으로 되어 있지 Error in do.call(c, x) : 'what' must be a function or character string
cbind()
는 함수 와 다르며 c()
, 작동하지만 결과가 다릅니다.
lapply
리스트에 함수를 적용하고, do.call
인수리스트와 함께 함수를 호출합니다. 그것은 나에게 상당히 다른 것처럼 보입니다 ...
목록이있는 예제를 제공하려면 다음을 수행하십시오.
X <- list(1:3,4:6,7:9)
lapply를 사용하면 다음과 같이 목록의 모든 요소의 평균을 얻습니다.
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call
"trim"인수가 1 일 것으로 예상되므로 오류가 발생합니다.
반면 rbind
에 모든 인수를 행 방향으로 바인딩합니다. X를 행 단위로 바인딩하려면 다음을 수행하십시오.
> do.call(rbind,X)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
을 사용 lapply
하면 R은 rbind
목록의 모든 요소에 적용 되어 다음과 같이 말도 안됩니다.
> lapply(X,rbind)
[[1]]
[,1] [,2] [,3]
[1,] 1 2 3
[[2]]
[,1] [,2] [,3]
[1,] 4 5 6
[[3]]
[,1] [,2] [,3]
[1,] 7 8 9
Map과 같은 것을 가지려면 ?mapply
, 이것이 필요합니다 . 예를 들어 X의 모든 요소의 평균을 얻으려면 다른 트리밍으로 다음을 사용할 수 있습니다.
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
lapply
유사하다 map
, do.call
아니다. lapply
리스트의 모든 요소에 함수를 적용하고 do.call
모든 함수 인수가 리스트에 있는 함수를 호출합니다. 따라서 n
요소 목록의 경우 함수 호출 lapply
이 있고 n
함수 호출 do.call
이 하나뿐입니다. 그래서 do.call
매우 다르다 lapply
. 이것이 귀하의 문제를 분명히하기를 바랍니다.
코드 예 :
do.call(sum, list(c(1, 2, 4, 1, 2), na.rm = TRUE))
과:
lapply(c(1, 2, 4, 1, 2), function(x) x + 1)
많은 답변이 있었지만 여기에 참고할만한 예가 있습니다. 다음과 같이 데이터 목록이 있다고 가정하십시오.
L=list(c(1,2,3), c(4,5,6))
lapply 함수는리스트를 리턴합니다.
lapply(L, sum)
위의 의미는 다음과 같습니다.
list( sum( L[[1]]) , sum( L[[2]]))
이제 똑같은 일을 해 봅시다.
do.call(sum, L)
그 뜻은
sum( L[[1]], L[[2]])
이 예에서는 21을 반환합니다. 간단히 말해서 lapply는 항상 목록을 반환하는 반면 do.call의 반환 유형은 실제로 실행되는 함수에 따라 다릅니다.
do.call
거의 동일apply
리스프에서