lapply와 do.call의 차이점은 무엇입니까?
두 기능으로 을 하고 있습니다: 저는최을에배있두인기혼해다니습란럽스로으능가.lapply그리고.do.call그들은 단지 비슷한 것 같습니다.map리스프에서 작동합니다.그런데 왜 이렇게 다른 이름을 가진 두 가지 기능이 있을까요? R은 왜은그다같함은사않수까습니용지라는 을 사용하지 ?map?
라는 기능이 있습니다.Map다른 언어의 지도와 유사할 수 있습니다.
lapplyX와 길이가 같은 목록을 반환합니다. 각 요소는 X의 해당 요소에 FUN을 적용한 결과입니다.do.call이름 또는 함수와 전달할 인수 목록에서 함수 호출을 구성하고 실행합니다.Map주어진 벡터의 해당 요소에 함수를 적용합니다...Map에 대한 간단한 포장지입니다.mapply이는 커먼 리스프의 맵카와 유사하게 결과를 단순화하려고 시도하지 않습니다(그러나 인수는 재활용됩니다).이후 버전에서는 결과 유형을 일부 제어할 수 있습니다.
Map주위의 포장지입니다.mapplylapply는 의특한경니다의 입니다.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"
lapply " " 를 합니다.do.call인수 목록을 사용하여 함수를 호출합니다.내겐 꽤 달라 보이는군요...
목록을 사용하여 예제를 제공하는 방법
X <- list(1:3,4:6,7:9)
래핑을 사용하면 목록의 모든 요소의 평균을 다음과 같이 얻을 수 있습니다.
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call"valid1로 합니다. "valid"와 "valid"는 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 요소에 를 주는 것: 록의모든요소목대에해다음같과다제넌니공합를센스은▁to▁you목.
> 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
지도와 같은 것을 가지려면, 당신은 필요합니다.?mapply완전히 입니다. 를 들어 X에 있는 , 트리밍을하면 됩니다. 예를 들어 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호출 및 함수호출, 그고리▁functiondo.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)
대부분의 간단한 단어로:
lapply()에는 목록의 각 요소에 대해 지정된 함수가 적용되므로 여러 함수 호출이 있습니다.do.call()는 지정된 함수를 목록 전체에 적용하므로 함수 호출은 하나뿐입니다.
학습하는 가장 좋은 방법은 R 설명서의 기능 예제를 사용하는 것입니다.
많은 답변들이 있었지만, 여기 참고를 위한 제 예가 있습니다.다음과 같은 데이터 목록이 있다고 가정합니다.
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의 반환 유형은 실제로 실행된 함수에 따라 다릅니다.
lapply()는 지도와 유사한 함수입니다. do.call() 를 열거하지 할 때 합니다.인수를 열거하는 대신 목록 형식으로 함수에 전달하는 데 사용됩니다.를 들면 예를들어들.
> do.call("+",list(4,5))
[1] 9
두 가지 차이점은 다음과 같습니다.
lapply(1:n,function,parameters)
=> 이것은 함수에 1, 매개변수를 전송합니다 => 이것은 함수에 2, 매개변수를 전송합니다 등등.
do.call
기능할 벡터 및 매개 변수로 1…n만 전송
그래서 응용 프로그램에는 함수 호출이 없습니다. 실행 중인 호출은 하나뿐입니다.
언급URL : https://stackoverflow.com/questions/10801750/whats-the-difference-between-lapply-and-do-call
'programing' 카테고리의 다른 글
| 애니메이션 완료 후 CABasic Animation이 초기 값으로 재설정됨 (0) | 2023.06.05 |
|---|---|
| Xcode의 후행 공백 잘라내기 (0) | 2023.06.05 |
| Twitter 부트스트랩을 사용하여 열 가운데 맞춤 (0) | 2023.05.31 |
| Gemfile을 찾을 수 없습니다. (0) | 2023.05.31 |
| C#은 첫 번째 패스 예외 필터링을 지원하지 않는 이유는 무엇입니까? (0) | 2023.05.31 |