R застосувати функцію з декількома параметрами


128

У мене є функція f(var1, var2)в Р. Припустимо, ми встановили, var2 = 1і тепер я хочу застосувати цю функцію f()до списку L. В основному я хочу отримати новий список L * з виходами

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

Як мені це зробити або apply, mapplyабо lapply?


Відповіді:


190

Просто передайте var2 як додатковий аргумент одній із застосуючих функцій.

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

sapply(mylist,myfxn,var2=var2)

Це передає те саме var2для кожного дзвінка myfxn. Якщо замість цього ви хочете, щоб кожен дзвінок myfxnотримував 1-й / 2-й / 3-й / і т.д. елемент і, mylistі var2тоді ви знаходитесь у mapplyдомені.


5
але зауважте, що це myfxnможе бути векторизовано, і в цьому випадку варто скористатисяmyfxn(unlist(mylist), var2=var2)
баптист,

Початковий приклад був незрозумілим, але, здається, був невекторизованим. Точка добре взята, проте.
Арі Б. Фрідман

Чи є спосіб зробити цю роботу функцією "на льоту"? Приблизно так: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Але я отримую помилку, що аргумент 2 відповідає численним формальним аргументам
emudrak

1
@emudrak Я думаю, що проблема полягає в тому, що ви називаєте аргумент, який ви передаєте varзамість var2. R не можу божествувати, що ти маєш на увазі
Арі Б. Фрідман

49

Якщо у вашій функції є дві векторні змінні і необхідно обчислити кожне їх значення (як згадує @Ari B. Friedman), ви можете використовувати mapplyнаступне:

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

що дає вам:

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

3
Одне підсумок для узагальнення навіть з простим і зрозумілим прикладом.
JASC

mapplyтакож буде переробляти, якщо vars1є один елемент. Наприклад, коли vars1 <- 3, mapply(mult_one, vars1, vars2)повертається 30 60 90. Це корисно, коли потрібно використовувати lapplyдругий аргумент функції.
Пол Рудьо

3

Для подальшого узагальнення прикладу @ Олександра outerактуально у випадках, коли функція повинна обчислювати себе на кожній парі векторних значень:

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

дає:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.