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?


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.


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


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


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).
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.