passare diversi argomenti a FUN of lapply (e altri * si applicano)


99

Ho una domanda riguardante il passaggio di più argomenti a una funzione, quando si utilizza lapplyin R.

Quando uso lapply con la sintassi di lapply(input, myfun);- questo è facilmente comprensibile e posso definire myfun in questo modo:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

e gli elementi di inputvengono passati come xargomento a myfun.

Ma cosa succede se devo passare qualche altra discussione a myfunc? Ad esempio, è definito così:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

Come posso usare questa funzione passando entrambi gli inputelementi (come xargomento) e qualche altro argomento?


Terminare le righe di input della console R con ";" è un segno che probabilmente hai utilizzato un linguaggio di elaborazione macro in passato. L'argomento dei tre punti è descritto nella sottosezione 4 della sezione "Scrivere le proprie funzioni" del documento "Introduzione a R", probabilmente il primo "Manuale" che dovresti leggere.
IRTFM

Risposte:


121

Se cerchi la pagina della guida, uno degli argomenti lapplyè il misterioso .... Quando guardiamo la sezione Argomenti della pagina della guida, troviamo la seguente riga:

...: optional arguments to ‘FUN’.

Quindi tutto ciò che devi fare è includere il tuo altro argomento nella lapplychiamata come argomento, in questo modo:

lapply(input, myfun, arg1=6)

e lapply, riconoscendo che arg1non è un argomento con cui sa cosa fare, lo trasmetterà automaticamente myfun. Tutte le altre applyfunzioni possono fare la stessa cosa.

Un addendum: puoi usare anche ...quando scrivi le tue funzioni. Ad esempio, supponi di scrivere una funzione che chiama plota un certo punto e di voler essere in grado di modificare i parametri del grafico dalla chiamata di funzione. Puoi includere ogni parametro come argomento nella tua funzione, ma è fastidioso. Invece puoi usare ...(come argomento sia per la tua funzione che per la chiamata a tracciare al suo interno) e far passare automaticamente qualsiasi argomento che la tua funzione non riconosce plot.


E se il tuo secondo argomento, ad esempio "arg1", fosse una lista che corrisponde alla lista "input"? Quando provo lapply (input, myfun, arg1 = input2) dove input2 è un elenco, sembra che lapply passi l'intero elenco in una volta invece di elemento per elemento come con 'input'.
Alan

10
Ho appena trovato una risposta in un altro post che funziona: mapply (myfun, df $ input, df $ input2)
Alan


11

Puoi farlo nel modo seguente:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

e otterrai la risposta:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600


3
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xè un vettore o una lista e myfunin lapply(x, myfun)è chiamato per ogni elemento di xseparatamente.

opzione 1

Se desideri utilizzare l'intero arg1in ogni myfunchiamata ( myfun(x[1], arg1), myfun(x[2], arg1)ecc.), Usa lapply(x, myfun, arg1)(come indicato sopra).

opzione 2

Se tuttavia desideri chiamare myfunogni elemento di arg1separatamente insieme agli elementi di x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])ecc.), Non è possibile utilizzare lapply. Utilizzare invece mapply(myfun, x, arg1)(come indicato sopra) o apply:

 apply(cbind(x,arg1), 1, myfun)

o

 apply(rbind(x,arg1), 2, myfun).
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.