Tenho uma pergunta sobre como passar vários argumentos para uma função, ao usar lapply
em 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 input
são passados como x
argumento 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 input
elementos (como x
argumento) e algum outro argumento?
Respostas:
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:Portanto, tudo o que você precisa fazer é incluir seu outro argumento na
lapply
chamada como um argumento, assim:e
lapply
, reconhecendo quearg1
não é um argumento com o qual ela sabe o que fazer, o transmitirá automaticamentemyfun
. Todas as outrasapply
funçõ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 chamaplot
em 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 paraplot
.fonte
Conforme sugerido por Alan, a função 'mapply' aplica uma função a várias Listas Múltiplas ou Argumentos de Vetor:
Consulte a página do manual: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html
fonte
outer
na mesma linha, que aplica uma função a cada par de valores em dois argumentos vetoriais. Página de manualVocê pode fazer isso da seguinte maneira:
e você obterá a resposta:
[[1]] [1] 200
[[2]] [1] 400
[[3]] [1] 600
fonte
x
é um vetor ou uma lista emyfun
inlapply(x, myfun)
é chamado para cada elemento dex
separadamente.Opção 1
Se você gostaria de usar todo
arg1
em cadamyfun
chamada (myfun(x[1], arg1)
,myfun(x[2], arg1)
etc.), o usolapply(x, myfun, arg1)
(como indicado acima).opção 2
No entanto, se você quiser chamar
myfun
cada elemento dearg1
separadamente ao lado de elementos dex
(myfun(x[1], arg1[1])
,myfun(x[2], arg1[2])
etc.), não é possível usarlapply
. Em vez disso, usemapply(myfun, x, arg1)
(conforme indicado acima) ouapply
:ou
fonte