R aplicar função com vários parâmetros


128

Eu tenho uma função f(var1, var2)em R. Suponha que definimos var2 = 1e agora quero aplicar a função f()à lista L. Basicamente, quero obter uma nova lista L * com as saídas

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

Como posso fazer isso com qualquer um apply, mapplyou lapply?


Respostas:


190

Apenas passe var2 como um argumento extra para uma das funções de aplicação.

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

sapply(mylist,myfxn,var2=var2)

Isso passa o mesmo var2para todas as chamadas de myfxn. Se você deseja que cada chamada myfxnreceba o 1º / 2º / 3º / etc. elemento de ambos myliste var2, então você está no mapplydomínio de.


5
Mas note que myfxnpode ser vectorized, caso em que deve-se usarmyfxn(unlist(mylist), var2=var2)
Baptiste

O exemplo original não era claro, mas parecia não ser vetorizado. Ponto bem tomado, no entanto.
Ari B. Friedman

É a maneira de fazer isso funcionar como uma função "on the fly"? Algo parecido com isto: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Mas eu recebo um erro de que o argumento 2 corresponde a vários argumentos formais
emudrak

1
@ Emudrak Eu acho que o problema é justamente que você está nomeando o argumento que passa em varvez de var2. R não pode adivinhar o que você quer dizer.
Ari B. Friedman

49

Se sua função possui duas variáveis ​​vetoriais e deve se calcular em cada valor delas (conforme mencionado por @Ari B. Friedman), você pode usar mapplyo seguinte:

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

o que lhe dá:

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

3
Um voto positivo para generalização, mesmo com um exemplo simples e claro.
JASC

mapplytambém reciclará se vars1tiver um único elemento. Por exemplo vars1 <- 3, quando , mapply(mult_one, vars1, vars2)retorna 30 60 90. Isso é útil quando você deseja usar lapplysobre o segundo argumento de uma função.
Paul Rougieux 10/06/19

3

Para generalizar ainda mais o exemplo de @ Alexander, outeré relevante nos casos em que uma função deve se calcular em cada par de valores vetoriais:

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

dá:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.