chuyển một số đối số tới FUN của lapply (và những đối số khác * áp dụng)


99

Tôi có một câu hỏi liên quan đến việc chuyển nhiều đối số cho một hàm khi sử dụng lapplytrong R.

Khi tôi sử dụng lapply với cú pháp của lapply(input, myfun);- điều này rất dễ hiểu và tôi có thể định nghĩa myfun như thế:

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

lapply(input, myfun);

và các phần tử của inputđược chuyển làm xđối số cho myfun.

Nhưng nếu tôi cần chuyển thêm một số đối số vào myfuncthì sao? Ví dụ, nó được định nghĩa như vậy:

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

Làm cách nào để sử dụng hàm này với việc chuyển cả hai inputphần tử (dưới dạng xđối số) và một số đối số khác?


1
Kết thúc dòng đầu vào bảng điều khiển R bằng ";" là một dấu hiệu cho thấy bạn có thể đã sử dụng một số ngôn ngữ xử lý macro trong quá khứ. Đối số ba dấu chấm được mô tả trong tiểu mục 4 của phần "Viết các hàm của riêng bạn" của tài liệu "giới thiệu về R", được cho là "Hướng dẫn sử dụng" đầu tiên mà bạn nên đọc.
IRTFM

Câu trả lời:


122

Nếu bạn tra cứu trang trợ giúp, một trong những lập luận lapplylà bí ẩn .... Khi chúng tôi xem phần Đối số của trang trợ giúp, chúng tôi tìm thấy dòng sau:

...: optional arguments to ‘FUN’.

Vì vậy, tất cả những gì bạn phải làm là bao gồm đối số khác của bạn trong lapplycuộc gọi dưới dạng đối số, như sau:

lapply(input, myfun, arg1=6)

lapply, nhận ra đó arg1không phải là một đối số mà nó biết phải làm gì, sẽ tự động chuyển nó sang myfun. Tất cả các applychức năng khác có thể làm điều tương tự.

Phụ lục: Bạn cũng có thể sử dụng ...khi viết các hàm của riêng mình. Ví dụ: giả sử bạn viết một hàm gọi plotvào một thời điểm nào đó và bạn muốn có thể thay đổi các tham số biểu đồ từ lệnh gọi hàm của mình. Bạn có thể bao gồm mỗi tham số làm đối số trong hàm của mình, nhưng điều đó thật khó chịu. Thay vào đó, bạn có thể sử dụng ...(làm đối số cho cả hàm của bạn và lệnh gọi để vẽ biểu đồ bên trong nó) và có bất kỳ đối số nào mà hàm của bạn không nhận ra sẽ được tự động chuyển sang plot.


Điều gì sẽ xảy ra nếu đối số thứ hai của bạn, ví dụ: "arg1" là một danh sách khớp với danh sách "đầu vào"? Khi tôi thử lapply (input, myfun, arg1 = input2) trong đó input2 là một danh sách, có vẻ như lapply chuyển toàn bộ danh sách cùng một lúc thay vì từng phần tử như với 'input'.
Alan

10
Tôi vừa tìm thấy câu trả lời trong một bài đăng khác hoạt động: mapply (myfun, df $ input, df $ input2)
Alan

18

Theo đề xuất của Alan, hàm 'mapply' áp dụng một hàm cho nhiều Danh sách nhiều hoặc Đối số vectơ:

mapply(myfun, arg1, arg2)

Xem trang người đàn ông: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html


Và điều đáng nói là outertrong cùng một mạch, áp dụng một hàm cho từng cặp giá trị trong hai đối số vectơ. Trang người đàn ông: stat.ethz.ch/R-manual/R-devel/library/base/html/outer.html
ms609

11

Bạn có thể thực hiện theo cách sau:

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

    }

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

và bạn sẽ nhận được câu trả lời:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600


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

xlà một vectơ hoặc một danh sách và myfuntrong lapply(x, myfun)được gọi cho từng phần tử xriêng biệt.

lựa chọn 1

Nếu bạn muốn sử dụng toàn bộ arg1trong mỗi myfuncuộc gọi ( myfun(x[1], arg1), myfun(x[2], arg1)v.v.), hãy sử dụng lapply(x, myfun, arg1)(như đã nêu ở trên).

Lựa chọn 2

Tuy nhiên, nếu bạn muốn gọi myfuntừng phần tử arg1riêng biệt cùng với các phần tử của x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])v.v.), bạn không thể sử dụng lapply. Thay vào đó, hãy sử dụng mapply(myfun, x, arg1)(như đã nêu ở trên) hoặc apply:

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

hoặc là

 apply(rbind(x,arg1), 2, myfun).
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.