2010-08-09 51 views
3

如果我想知道什麼是存儲在R函數內的...的說法,我可以簡單地將其轉換爲一個列表,像這樣在R中,你如何評估...在調用函數中?

foo <- function(...) 
{ 
    dots <- list(...) 
    print(dots) 
} 

foo(x = 1, 2, "three") 
#$x 
#[1] 1 
# 
#[[2]] 
#[1] 2 
# 
#[[3]] 
#[1] "three" 

我無法弄清楚什麼是如何評價...在調用函數中。在下一個示例中,我希望baz的內容返回...參數bar

bar <- function(...) 
{ 
    baz() 
} 

baz <- function() 
{ 
    # What should dots be assigned as? 
    # I tried           
    # dots <- get("...", envir = parent.frame()) 
    # and variations of 
    # dots <- eval(list(...), envir = parent.frame()) 
    print(dots) 
} 

bar(x = 1, 2, "three") 

get("...", envir = parent.frame())回報<...>,這看起來很有希望,但我無法弄清楚如何提取任何從它有用。

eval(list(...), envir = parent.frame())引發錯誤,聲稱...使用不正確。

如何從bar檢索...

回答

3

想通了。我需要evalsubstitute的組合。 baz應定義爲

baz <- function() 
{ 
    dots <- eval(substitute(list(...), env = parent.frame())) 
    print(dots) 
} 
+0

+1這是一個有趣的例子。如果你有機會,如果你可以更新這個解釋爲什麼*爲什麼這可能是省略號的必要條件,而不是其他變量呢? – Shane 2010-08-09 17:05:10

+0

@Shane:一個很好的問題。我將進一步挖掘,但這正在迅速進入人腦融化領域。待續... – 2010-08-09 17:41:55

1

這應該工作:

bar <- function(...) 
{ 
    baz(...=...) 
} 

baz <- function(...) 
{ 
    print(list(...)) 
} 

bar(x = 1, 2, "three") 

就分配給它的子功能。

或者,你可以指定省略號作爲父函數列表:

bar <- function(...) 
{ 
    bar.x <- list(...) 
    baz() 
} 

baz <- function() 
{ 
    dots <- get("bar.x", envir = parent.frame()) 
    print(dots) 
} 

bar(x = 1, 2, "three") 

這是同樣的想法,但因爲你覆蓋省略號我不會建議吧:

bar <- function(...) 
{ 
    ... <- list(...) 
    baz() 
} 

baz <- function() 
{ 
    dots <- get("...", envir = parent.frame()) 
    print(dots) 
} 

bar(x = 1, 2, "three") 
+0

謝謝,但如果我不能/不想修改'baz'?是否可以在不同的環境中評估「......」? – 2010-08-09 16:50:24

+0

看到我的第二個解決方案?我不確定那個<...>對象;它的類是「...」,顯然與原始省略號不一樣。 – Shane 2010-08-09 16:53:16

1

總之:不要。試圖重新定義R的範圍規則只會導致心痛和痛苦。

+0

想到一個特定於語言環境的呼氣(緩衝,因爲註釋有最小長度):Rmen – mdsumner 2011-03-10 12:49:21