lapply와 do.call의 차이점은 무엇입니까?
두 기능으로 을 하고 있습니다: 저는최을에배있두인기혼해다니습란럽스로으능가.lapply
그리고.do.call
그들은 단지 비슷한 것 같습니다.map
리스프에서 작동합니다.그런데 왜 이렇게 다른 이름을 가진 두 가지 기능이 있을까요? R은 왜은그다같함은사않수까습니용지라는 을 사용하지 ?map
?
라는 기능이 있습니다.Map
다른 언어의 지도와 유사할 수 있습니다.
lapply
X와 길이가 같은 목록을 반환합니다. 각 요소는 X의 해당 요소에 FUN을 적용한 결과입니다.do.call
이름 또는 함수와 전달할 인수 목록에서 함수 호출을 구성하고 실행합니다.Map
주어진 벡터의 해당 요소에 함수를 적용합니다...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"
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 |