R ใช้ฟังก์ชันที่มีพารามิเตอร์หลายตัว


129

ฉันมีฟังก์ชั่นf(var1, var2)ในอาร์สมมติว่าเราตั้งค่าvar2 = 1และตอนนี้ฉันต้องการที่จะใช้ฟังก์ชั่นในรายการf() Lโดยทั่วไปฉันต้องการรับรายการใหม่ L * พร้อมเอาต์พุต

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

ฉันจะทำวิธีนี้กับอย่างใดอย่างหนึ่งapply, mapplyหรือlapply?


คำถามที่คล้ายกัน: stackoverflow.com/questions/2545879/…
Scott C Wilson

คำตอบ:


191

เพียงแค่ส่ง 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ได้รับ 1st / 2nd / 3rd / etc แทน องค์ประกอบของทั้งสองmylistและvar2คุณอยู่ในmapplyโดเมนของ


5
แต่โปรดทราบว่าmyfxnอาจเป็น vectorised ซึ่งในกรณีนี้ควรใช้myfxn(unlist(mylist), var2=var2)
baptiste

ตัวอย่างเดิมไม่ชัดเจน แต่ดูเหมือนจะไม่ใช่เวกเตอร์ อย่างไรก็ตามชี้ให้เห็นได้ดี
Ari B. Friedman

เป็นวิธีที่จะทำให้งานนี้เป็นฟังก์ชั่น? สิ่งนี้: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)แต่ฉันได้รับข้อผิดพลาดว่าอาร์กิวเมนต์ 2 ตรงกับอาร์กิวเมนต์ที่เป็นทางการหลายรายการ
emudrak

1
@emudrak ผมคิดว่าปัญหามี jus ว่าคุณกำลังตั้งชื่ออาร์กิวเมนต์คุณผ่านแทนvar var2R ไม่สามารถบอกความหมายของคุณได้
Ari B. Friedman

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.