passando vários argumentos para FUN de lapply (e outros * se aplicam)

99

Tenho uma pergunta sobre como passar vários argumentos para uma função, ao usar lapplyem R.

Quando eu uso lapply com a sintaxe de lapply(input, myfun);- isso é facilmente compreensível e posso definir minha diversão assim:

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

lapply(input, myfun);

e os elementos de inputsão passados ​​como xargumento para myfun.

Mas e se eu precisar passar mais alguns argumentos para myfunc? Por exemplo, é definido assim:

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

Como posso usar essa função passando os dois inputelementos (como xargumento) e algum outro argumento?

Vasily A
fonte
Terminando as linhas de entrada do console R com ";" é um sinal de que você provavelmente usou alguma linguagem de processamento de macro no passado. O argumento dos pontos triplos é descrito na subseção 4 da seção "Escrevendo suas próprias funções" do documento "introdução ao R", provavelmente o primeiro "Manual" que você deve ler.
IRTFM de

Respostas:

121

Se você consultar a página de ajuda, um dos argumentos para lapplyé o misterioso .... Quando olhamos para a seção Argumentos da página de ajuda, encontramos a seguinte linha:

...: optional arguments to ‘FUN’.

Portanto, tudo o que você precisa fazer é incluir seu outro argumento na lapplychamada como um argumento, assim:

lapply(input, myfun, arg1=6)

e lapply, reconhecendo que arg1não é um argumento com o qual ela sabe o que fazer, o transmitirá automaticamente myfun. Todas as outras applyfunções podem fazer a mesma coisa.

Um adendo: você também pode usar ...quando estiver escrevendo suas próprias funções. Por exemplo, digamos que você escreva uma função que chama plotem algum ponto e deseja poder alterar os parâmetros do gráfico de sua chamada de função. Você pode incluir cada parâmetro como um argumento em sua função, mas isso é irritante. Em vez disso, você pode usar ...(como um argumento para sua função e a chamada para plot dentro dela) e ter qualquer argumento que sua função não reconheça ser automaticamente passado para plot.

Jonathan Christensen
fonte
E se o seu segundo argumento, por exemplo, "arg1" for uma lista que corresponde à lista de "entrada"? Quando tento lapply (input, myfun, arg1 = input2) onde input2 é uma lista, parece que lapply passa a lista inteira de uma vez em vez de elemento por elemento como em 'input'.
Alan
10
Acabei de encontrar uma resposta em outro post que funciona: mapply (myfun, df $ input, df $ input2)
Alan
18

Conforme sugerido por Alan, a função 'mapply' aplica uma função a várias Listas Múltiplas ou Argumentos de Vetor:

mapply(myfun, arg1, arg2)

Consulte a página do manual: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

Andrew
fonte
E vale a pena mencionar outerna mesma linha, que aplica uma função a cada par de valores em dois argumentos vetoriais. Página de manual
ms609
11

Você pode fazer isso da seguinte maneira:

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

    }

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

e você obterá a resposta:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

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

xé um vetor ou uma lista e myfunin lapply(x, myfun)é chamado para cada elemento de xseparadamente.

Opção 1

Se você gostaria de usar todo arg1em cada myfunchamada ( myfun(x[1], arg1), myfun(x[2], arg1)etc.), o uso lapply(x, myfun, arg1)(como indicado acima).

opção 2

No entanto, se você quiser chamar myfuncada elemento de arg1separadamente ao lado de elementos de x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])etc.), não é possível usar lapply. Em vez disso, use mapply(myfun, x, arg1)(conforme indicado acima) ou apply:

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

ou

 apply(rbind(x,arg1), 2, myfun).
Hanna
fonte