R applica la funzione con più parametri


128

Ho una funzione f(var1, var2)in R. Supponiamo di impostare var2 = 1e ora voglio applicare la funzione f()all'elenco L. Fondamentalmente voglio ottenere un nuovo elenco L * con le uscite

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

Come posso fare questo con uno apply, mapplyo lapply?


Risposte:


190

Basta passare var2 come argomento aggiuntivo a una delle funzioni di applicazione.

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

sapply(mylist,myfxn,var2=var2)

Questo passa lo stesso var2per ogni chiamata di myfxn. Se invece vuoi che ogni chiamata di myfxnottenga il 1 ° / 2 ° / 3 ° / ecc. elemento di entrambi myliste var2, quindi sei nel mapplydominio di.


5
Ma si noti che myfxnpossono essere Vectorised, nel qual caso si dovrebbe usaremyfxn(unlist(mylist), var2=var2)
Baptiste

L'esempio originale non era chiaro ma sembrava essere non vettorializzato. Punto ben preso, comunque.
Ari B. Friedman,

È un modo per farlo funzionare come una funzione "al volo?" Qualcosa del genere: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)ma ricevo un errore che l'argomento 2 corrisponde a più argomenti formali
emudrak,

1
@emudrak Penso che il problema sia che stai nominando l'argomento che passi varinvece di var2. R non posso dire cosa intendi.
Ari B. Friedman,

49

Se la tua funzione ha due variabili vettoriali e deve calcolarsi su ciascun valore (come indicato da @Ari B. Friedman) puoi usare mapply come segue:

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

che ti dà:

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

3
Un voto per la generalizzazione, anche con un esempio semplice e chiaro.
JASC,

mapplyriciclerà anche se vars1ha un singolo elemento. Ad esempio quando vars1 <- 3, mapply(mult_one, vars1, vars2)ritorna 30 60 90. Ciò è utile quando si desidera utilizzare lapplyil secondo argomento di una funzione.
Paul Rougieux,

3

Per generalizzare ulteriormente l'esempio di @ Alexander, outerè rilevante nei casi in cui una funzione deve calcolare se stessa su ciascuna coppia di valori vettoriali:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.