programing

lapply와 do.call의 차이점은 무엇입니까?

i4 2023. 6. 5. 23:36
반응형

lapply와 do.call의 차이점은 무엇입니까?

두 기능으로 을 하고 있습니다: 저는최을에배있두인기혼해다니습란럽스로으능가.lapply그리고.do.call그들은 단지 비슷한 것 같습니다.map리스프에서 작동합니다.그런데 왜 이렇게 다른 이름을 가진 두 가지 기능이 있을까요? R은 왜은그다같함은사않수까습니용지라는 을 사용하지 ?map?

라는 기능이 있습니다.Map다른 언어의 지도와 유사할 수 있습니다.

  • lapplyX와 길이가 같은 목록을 반환합니다. 각 요소는 X의 해당 요소에 FUN을 적용한 결과입니다.

  • do.call이름 또는 함수와 전달할 인수 목록에서 함수 호출을 구성하고 실행합니다.

  • Map주어진 벡터의 해당 요소에 함수를 적용합니다... Map에 대한 간단한 포장지입니다.mapply이는 커먼 리스프의 맵카와 유사하게 결과를 단순화하려고 시도하지 않습니다(그러나 인수는 재활용됩니다).이후 버전에서는 결과 유형을 일부 제어할 수 있습니다.


  1. Map주위의 포장지입니다.mapply
  2. lapply는 의특한경니다의 입니다.mapply
  3. 그므로러.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)

대부분의 간단한 단어로:

  1. lapply()에는 목록의 각 요소에 대해 지정된 함수가 적용되므로 여러 함수 호출이 있습니다.

  2. 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

반응형