ส่งผ่านข้อโต้แย้งหลายประการเพื่อ FUN of lapply (และอื่น ๆ * ใช้)


109

ฉันมีคำถามเกี่ยวกับการส่งอาร์กิวเมนต์หลายรายการไปยังฟังก์ชันเมื่อใช้lapplyในR.

เมื่อฉันใช้ lapply กับไวยากรณ์ของlapply(input, myfun);- สิ่งนี้เข้าใจได้ง่ายและฉันสามารถกำหนด myfun ได้เช่นนั้น:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

และองค์ประกอบของinputจะถูกส่งผ่านเป็นอาร์กิวเมนต์xmyfun

แต่ถ้าฉันต้องผ่านข้อโต้แย้งเพิ่มเติมอีกmyfuncล่ะ? ตัวอย่างเช่นมีการกำหนดไว้เช่นนั้น:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

ฉันจะใช้ฟังก์ชันนี้โดยส่งผ่านทั้งสองinputองค์ประกอบ (เป็นxอาร์กิวเมนต์) และอาร์กิวเมนต์อื่น ๆ ได้อย่างไร


1
การยุติบรรทัดอินพุตคอนโซล R ด้วย ";" เป็นสัญญาณว่าคุณอาจใช้ภาษาประมวลผลมาโครในอดีต อาร์กิวเมนต์จุดสามจุดอธิบายไว้ในส่วนย่อยที่ 4 ของส่วน "การเขียนฟังก์ชันของคุณเอง" ของเอกสาร "บทนำสู่ R" ซึ่งเป็น "คู่มือ" แรกที่คุณควรอ่าน
IRTFM

คำตอบ:


124

หากคุณมองขึ้นหน้าความช่วยเหลืออย่างใดอย่างหนึ่งของการขัดแย้งที่จะเป็นลึกลับlapply ...เมื่อเราดูส่วนอาร์กิวเมนต์ของหน้าวิธีใช้เราจะพบบรรทัดต่อไปนี้:

...: optional arguments to ‘FUN’.

ดังนั้นสิ่งที่คุณต้องทำคือรวมอาร์กิวเมนต์อื่น ๆ ของคุณในการlapplyโทรเป็นอาร์กิวเมนต์ดังนี้

lapply(input, myfun, arg1=6)

และlapplyตระหนักว่าไม่โต้แย้งก็รู้ว่าจะทำอย่างไรกับการที่จะผ่านมันไปโดยอัตโนมัติarg1 ฟังก์ชันmyfunอื่น ๆ ทั้งหมดapplyสามารถทำสิ่งเดียวกันได้

ภาคผนวก:คุณสามารถใช้...เมื่อคุณเขียนฟังก์ชันของคุณเองได้เช่นกัน ตัวอย่างเช่นสมมติว่าคุณเขียนฟังก์ชันที่เรียกใช้plotณ จุดหนึ่งและคุณต้องการเปลี่ยนพารามิเตอร์การลงจุดจากการเรียกฟังก์ชันของคุณ คุณสามารถรวมพารามิเตอร์แต่ละตัวเป็นอาร์กิวเมนต์ในฟังก์ชันของคุณได้ แต่มันน่ารำคาญ แต่คุณสามารถใช้...(เป็นอาร์กิวเมนต์ทั้งฟังก์ชั่นและการเรียกร้องให้พล็อตที่อยู่ภายในของคุณ) และมีข้อโต้แย้งใด ๆ plotที่ฟังก์ชั่นของคุณไม่รู้จักถูกส่งผ่านโดยอัตโนมัติไปยัง


จะเกิดอะไรขึ้นถ้าอาร์กิวเมนต์ที่สองของคุณเช่น "arg1" เป็นรายการที่ตรงกับรายการ "อินพุต" เมื่อฉันลองใช้lapply (input, myfun, arg1 = input2)โดยที่ input2 เป็นรายการดูเหมือนว่า lapply จะส่งผ่านรายการทั้งหมดในครั้งเดียวแทนที่จะเป็นองค์ประกอบตามองค์ประกอบเช่นเดียวกับ 'input'
Alan

10
ฉันเพิ่งพบคำตอบในโพสต์อื่นที่ใช้งานได้: mapply (myfun, df $ input, df $ input2)
อลัน

18

ตามที่ Alan แนะนำฟังก์ชัน 'mapply' ใช้ฟังก์ชันกับ Multiple Lists หรือ Vector Arguments:

mapply(myfun, arg1, arg2)

ดูหน้าคน: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html


และมันก็คุ้มค่าที่จะกล่าวถึงouterในหลอดเลือดดำเดียวกันซึ่งใช้ฟังก์ชันกับค่าแต่ละคู่ในอาร์กิวเมนต์เวกเตอร์สองตัว หน้าคน: stat.ethz.ch/R-manual/R-devel/library/base/html/outer.html
ms609

11

คุณสามารถทำได้ด้วยวิธีต่อไปนี้:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

และคุณจะได้รับคำตอบ:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600


5
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xเป็นเวกเตอร์หรือรายการและmyfunในlapply(x, myfun)เรียกว่าสำหรับองค์ประกอบของแต่ละxแยก

ตัวเลือกที่ 1

หากคุณต้องการที่จะใช้ทั้งarg1ในแต่ละmyfunโทร ( myfun(x[1], arg1), myfun(x[2], arg1)ฯลฯ ), การใช้งานlapply(x, myfun, arg1)(ตามที่ระบุไว้ข้างต้น)

ทางเลือกที่ 2

หากคุณต้องการ แต่ชอบที่จะเรียกmyfunไปยังองค์ประกอบของแต่ละarg1แยกควบคู่ไปกับองค์ประกอบของx( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])ฯลฯ ) lapplyมันเป็นไปไม่ได้ที่จะใช้งาน ให้ใช้mapply(myfun, x, arg1)(ตามที่ระบุไว้ข้างต้น) หรือapply:

 apply(cbind(x,arg1), 1, myfun)

หรือ

 apply(rbind(x,arg1), 2, myfun).
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.