2012-12-10 120 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的建议让我可以做到这一点。 –

相关问题