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


128

У меня есть функция f(var1, var2)в R. Предположим, мы установили, 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)
baptiste

Исходный пример был непонятен, но, похоже, не был векторизован. Однако точка зрения понятна.
Ари Б. Фридман

Есть ли способ заставить эту работу работать "на лету"? Примерно так: 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второй аргумент функции.
Paul Rougieux

3

Чтобы еще больше обобщить пример @Alexander, 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.