R áp dụng hàm với nhiều tham số


128

Tôi có một hàm f(var1, var2)trong R. Giả sử chúng ta đã đặt var2 = 1và bây giờ tôi muốn áp dụng hàm này f()vào danh sách L. Về cơ bản tôi muốn có một danh sách mới L * với các đầu ra

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

Làm thế nào để tôi làm điều này với một trong hai apply, mapplyhoặc lapply?


Câu trả lời:


190

Chỉ cần truyền var2 làm đối số phụ cho một trong các hàm áp dụng.

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

sapply(mylist,myfxn,var2=var2)

Điều này vượt qua tương tự var2cho mọi cuộc gọi của myfxn. Nếu thay vào đó, bạn muốn mỗi cuộc gọi của myfxnbạn nhận được 1/2 / 3/3 / v.v. yếu tố của cả hai mylistvar2sau đó bạn thuộc mapplymiền của.


5
nhưng lưu ý rằng myfxncó thể được véc tơ hóa, trong trường hợp đó người ta nên sử dụngmyfxn(unlist(mylist), var2=var2)
baptiste

Ví dụ ban đầu không rõ ràng nhưng dường như không được vector hóa. Điểm cũng được thực hiện, tuy nhiên.
Ari B. Friedman

Là một cách để làm cho công việc này như là một chức năng "trên đường bay?" Một cái gì đó như thế này: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Nhưng tôi nhận được một lỗi mà đối số 2 khớp với nhiều đối số chính thức
emudrak

1
@emudrak Tôi nghĩ rằng có một vấn đề là bạn đang đặt tên cho đối số bạn vượt qua varthay vì var2. R không thể thần thánh những gì bạn có ý nghĩa.
Ari B. Friedman

49

Nếu hàm của bạn có hai biến vectơ và phải tự tính toán trên từng giá trị của chúng (như được đề cập bởi @Ari B. Friedman), bạn có thể sử dụng mapplynhư sau:

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

cung cấp cho bạn:

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

3
Một upvote để khái quát hóa, ngay cả với một ví dụ đơn giản và rõ ràng.
JASC

mapplycũng sẽ tái chế nếu vars1có một yếu tố duy nhất. Ví dụ khi vars1 <- 3, mapply(mult_one, vars1, vars2)trả về 30 60 90. Điều này hữu ích khi bạn muốn sử dụng lapplyđối số thứ hai của hàm.
Paul Rougieux

3

Để khái quát hơn nữa ví dụ của @ Alexandeller, outercó liên quan trong trường hợp hàm phải tự tính toán trên mỗi cặp giá trị vectơ:

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

cho:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.