2012-12-10 186 views
0

我想將對象的值作爲參數傳遞給函數。強制評估作爲參數傳遞給函數的對象

# This is my object 
anObject <- "an_unkown_string" 

# I would like to do the equivalent of: 
someFunc("an_unkown_string") 

# .. by somehow calling on the object containing the string 
someFunc(??? (anObject)) 

例如,下面的示例功能(基於save()):

someFunc <- function(...) { 
    names <- as.character(substitute(list(...)))[-1L] 
    return(names) 
} 

# Ideally, the output would be: 
someFunc(??? (anObject)) 
[1] "an_unkown_string" 

我沒有訪問和修改someFunc 我曾嘗試以下,但沒有成功。

someFunc(Name_of_Object) 
someFunc(eval(Name_of_Object)) 
someFunc(evalq(Name_of_Object)) 
someFunc(force(Name_of_Object)) 
someFunc(eval(parse(text=Name_of_Object))) 

任何幫助表示讚賞。

回答

2

如何

> do.call(someFunc, list(anObject)) 
[1] "an_unkown_string" 

或者你可以做一個包裝

myWrap <- function(...) { 
    do.call(someFunc, as.list(...)) 
} 

> myWrap(anObject) 
[1] "an_unkown_string" 

的另一種方式,從而構建調用和評價它:

> call("someFunc", anObject) 
someFunc("an_unkown_string") 
> eval(call("someFunc", anObject)) 
[1] "an_unkown_string" 

我想我應該提到的是?do.call

的一些功能,如替代行爲,不會爲使用do.call評估功能一樣,如果他們從解釋評價。精確的語義目前尚未定義,可能會有變化。

然而,至少目前,anObject是當呼叫被構造(在調用calldo.call)來評價,所以substitute查找「an_unknown_string」而不是「anObject」。

+0

天才!謝謝!導致這種解決方案的洞察力(或思考過程)是什麼? –

+0

除此之外,我可能會使用'do.call'太多。 :-)你想用'anObject'的值調用'someFunc()',所以你需要構造一個調用。如果你給'do.call'一個函數和一個參數列表,它用這些參數調用函數。 – GSee

0

我很困惑。你爲什麼試圖讓它比真實更復雜?

someFunc <- function(obj) { 
    return(obj) 
} 

> someFunc(anObject) 
[1] "an_unkown_string" 
+0

'someFunc'可以是我沒有所有權的任何函數 - 因此,我無法修改。我想傳遞給它不是一個對象,而是我的對象的_value_(它實際上是另一個對象的名稱)。 @ GSee的建議讓我可以做到這一點。 –

相關問題