여러 매개 변수가있는 R 적용 기능


128

f(var1, var2)R에 함수 가 있습니다. 설정 var2 = 1하고 이제 함수 f()를 목록 에 적용하려고 한다고 가정 합니다 L. 기본적으로 출력과 함께 새 목록 L *을 얻고 싶습니다.

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

어떻게하면이 중 하나와 함께해야합니까 apply, mapply또는 lapply?


답변:


190

적용 함수 중 하나에 추가 인수로 var2를 전달하면됩니다.

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

이것은 var2모든 호출에 동일 하게 전달 myfxn됩니다. 대신 각 호출이 myfxn1st / 2nd / 3rd / etc를 얻으려면. mylist및의 요소 var2이면 mapply의 도메인에 있습니다.


5
하지만 myfxn벡터화 될 수 있습니다.이 경우 사용해야합니다myfxn(unlist(mylist), var2=var2)
baptiste

원래의 예는 불분명하지만 벡터화되지 않은 것 같습니다. 그러나 요점은 잘 잡혔습니다.
Ari B. Friedman

이 작업을 "즉석에서"함수로 만드는 방법이 있습니까? 이 같은 뭔가 : sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)하지만 오류가 발생하는 주장이 일치 여러 형식 인수
emudrak

1
@emudrak 나는 당신이 var대신 전달하는 인수의 이름을 지정하고 있다는 문제가 있다고 생각합니다 var2. R은 당신이 의미하는 바를 신성하게 만들 수 없습니다.
Ari B. Friedman

49

함수에 두 개의 벡터 변수가 있고 각각의 값에 대해 자체 계산해야하는 경우 (@Ari B. Friedman에서 언급했듯이) mapply다음과 같이 사용할 수 있습니다 .

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

다음을 제공합니다.

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
단순하고 명확한 예를 들어도 일반화를위한 하나의 찬성표입니다.
JASC

mapplyvars1단일 요소가있는 경우에도 재활용됩니다 . 예를 들어 vars1 <- 3, mapply(mult_one, vars1, vars2)는를 반환합니다 30 60 90. 이것은 lapply함수의 두 번째 인수에 대해 사용하려는 경우 유용 합니다.
폴 Rougieux

3

@Alexander의 예를 더 일반화하려면 outer함수가 각 벡터 값 에서 자체적으로 계산해야하는 경우에 관련 됩니다.

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

제공합니다 :

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.