R应用具有多个参数的功能


128

f(var1, var2)在R中有一个函数。假设我们已经设置好了var2 = 1,现在我想将该函数f()应用于列表L。基本上我想用输出获得一个新的列表L *

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

如何做到这一点无论使用哪种applymapply还是lapply


Answers:


190

只需将var2作为附加参数传递给apply函数之一即可。

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

sapply(mylist,myfxn,var2=var2)

这会将传递var2给的每个调用myfxn。如果相反,您希望每次调用都myfxn获得1st / 2nd / 3rd / etc。两者的元素mylistvar2,然后你在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 <- 3mapply(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.