답변:
Map다른 언어의 map과 비슷한 함수 가 있습니다.
lapply X와 동일한 길이의 목록을 리턴합니다. 각 요소는 FUN을 X의 해당 요소에 적용한 결과입니다.
do.call 이름이나 함수 및 전달할 인수 목록에서 함수 호출을 구성하고 실행합니다.
Map주어진 벡터의 해당 요소에 함수를 적용합니다 ... Common Lisp의 mapcar와 비슷하지만 결과를 단순화하려고 시도하지 않는 Map간단한 래퍼입니다 mapply(그러나 인수는 재활용됩니다). 이후 버전에서는 결과 유형을 일부 제어 할 수 있습니다.
Map 래퍼입니다 mapplylapply 특별한 경우입니다 mapplyMap그리고 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리스프에서