亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在編寫自己的函數時使用R的省略功能?

如何在編寫自己的函數時使用R的省略功能?

江戶川亂折騰 2019-06-27 16:37:14
如何在編寫自己的函數時使用R的省略功能?R語言有一個很好的特性來定義函數,這些函數可以使用可變數量的參數。例如,函數data.frame接受任意數量的參數,每個參數將成為結果數據表中某列的數據。示例用法:> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))   letters numbers notes1       a       1    do2       b       2    re3       c       3    mi函數的簽名包括省略號,如下所示:function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,      stringsAsFactors = default.stringsAsFactors()) {     [FUNCTION DEFINITION HERE]}我想編寫一個類似的函數,獲取多個值并將它們合并為一個返回值(以及一些其他處理)。為了做到這一點,我需要弄清楚如何“解壓”...函數中的參數。我不知道該怎么做。函數定義中的相關行data.frame是object <- as.list(substitute(list(...)))[-1L]我完全搞不懂。那么,如何將省略號從函數的簽名轉換成列表呢?更確切地說,我怎么寫get_list_from_ellipsis在下面的代碼里?my_ellipsis_function(...) {     input_list <- get_list_from_ellipsis(...)     output_list <- lapply(X=input_list, FUN=do_something_interesting)     return(output_list)}my_ellipsis_function(a=1:10,b=11:20,c=21:30)編輯似乎有兩種可能的方法來做到這一點。他們是as.list(substitute(list(...)))[-1L]和list(...)..然而,這兩種做法并不完全相同。(關于差異,請參見答案中的示例。)誰能告訴我他們之間的實際區別是什么,以及我應該使用哪一個?
查看完整描述

3 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

可以將省略號轉換為list(),然后對其執行操作:

> test.func <- function(...) { lapply(list(...), class) }> test.func(a="b", b=1)$a[1] "character"$b[1] "numeric"

所以你的get_list_from_ellipsis函數只不過是list.

這方面的有效用例是當您希望傳遞數目未知的要操作的對象時(如c()data.frame())。使用...但是,當您預先知道每個參數時,因為它增加了參數字符串的一些模糊性和進一步的復雜性(并且使函數簽名對任何其他用戶都不明確)。參數列表是函數用戶的重要文檔。

否則,當您希望將參數傳遞給子函數而不將它們全部暴露在您自己的函數參數中時,它也很有用。這可以在功能文檔中看到。


查看完整回答
反對 回復 2019-06-27
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

為了補充Shane和Dirk的回答:比較一下是很有趣的

get_list_from_ellipsis1 <- function(...){
  list(...)}get_list_from_ellipsis1(a = 1:10, b = 2:20) # returns a list of integer vectors$a [1]  1  2  3  4  5  6  7  8  9 10$b [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

帶著

get_list_from_ellipsis2 <- function(...){
  as.list(substitute(list(...)))[-1L]}get_list_from_ellipsis2(a = 1:10, b = 2:20) # returns a list of calls$a1:10$b2:20

就目前情況而言,這兩種版本似乎都適合您在my_ellipsis_function雖然第一條顯然更簡單


查看完整回答
反對 回復 2019-06-27
  • 3 回答
  • 0 關注
  • 1136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號