R aplică funcția R cu parametri multipli (Programare, R)

Michael a intrebat.

Am o funcție f(var1, var2) în R. Să presupunem că am setat var2 = 1 și acum vreau să aplic funcția f() la lista L. Practic, vreau să obțin o nouă listă L* cu ieșirile

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

Cum pot face acest lucru fie cu apply, , mapply sau lapply?

Comentarii

  • Întrebare similară: stackoverflow.com/questions/2545879/… –  > Por Scott C Wilson.
3 răspunsuri
Ari B. Friedman

Pur și simplu treceți var2 ca argument suplimentar la una dintre funcțiile apply.

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

sapply(mylist,myfxn,var2=var2)

Acest lucru trece același var2 la fiecare apel al funcției myfxn. Dacă, în schimb, doriți ca fiecare apel al funcției myfxn să obțină primul/al doilea/al treilea/al treilea/etc. element al ambelor elemente. mylist și var2, , atunci sunteți în mapplydomeniul lui .

Comentarii

  • dar rețineți că myfxn poate fi vectorizat, caz în care ar trebui să se utilizeze myfxn(unlist(mylist), var2=var2) –  > Por baptiste.
  • Exemplul inițial era neclar, dar părea să fie nevectorizat. Cu toate acestea, punctul de vedere este bine înțeles. –  > Por Ari B. Friedman.
  • Există o modalitate de a face acest lucru să funcționeze ca o funcție „din mers”? Ceva de genul acesta: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2) Dar primesc o eroare că argumentul 2 se potrivește cu mai multe argumente formale –  > Por emudrak.
  • @emudrak Cred că problema acolo este doar că numești argumentul pe care îl treci var în loc de var2. R nu poate ghici ce vrei să spui. –  > Por Ari B. Friedman.
Alexander

Dacă funcția dvs. are două variabile vectoriale și trebuie să se calculeze pe fiecare valoare a acestora (așa cum a menționat @Ari B. Friedman), puteți folosi mapply după cum urmează:

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

ceea ce vă oferă:

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

Comentarii

  • Un upvote pentru generalizare, chiar și cu un exemplu simplu și clar. –  > Por JASC.
  • mapply va recicla, de asemenea, dacă vars1 are un singur element. De exemplu, atunci când vars1 <- 3, , mapply(mult_one, vars1, vars2) returnează 30 60 90. Acest lucru este util atunci când doriți să utilizați lapply peste al doilea argument al unei funcții. –  > Por Paul Rougieux.
ms609

Pentru a generaliza și mai mult exemplul lui @Alexander, outer este relevant în cazurile în care o funcție trebuie să se calculeze pe sine la fiecare pereche de valori vectoriale:

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

Tags: