2014-01-15 129 views
4

這似乎是一個基本問題,但我似乎無法在stackoverflow上找到答案。返回函數的代碼

我怎樣才能獲得以下效果:

f <- function(x = 1){x^2} 
miracle(f) 
[1] "x^2" 

上下文是有光澤的應用程序(由RStudio包),其中我有一個textInput()功能到我提供初始值x^2。雖然這個工程:

textInput(inputId = "inFun", label = h4("Enter a function:"), value = "x^2") 

這並不:

textInput(inputId = "inFun", label = h4("Enter a function:"), value = f) 

看來,我需要的價值RHS像 「X^2」。

下面是我嘗試了好幾種變化的有代表性的樣本:

eval(parse(text = f)) 
Error in as.character(x) : 
    cannot coerce type 'closure' to vector of type 'character' 

f(x = "x") 
Error in x^2 : non-numeric argument to binary operator 

`f` 
function(x){x^2} 

f(x = `x`) 
Error in f(x = x) : object 'x' not found 

是有這個內置的功能?

+1

'身體(f)'呢? –

+0

你可以調整標題嗎?沒有在標題中提供答案? –

回答

9

我想根據RomanLuštrik的評論回答我自己的問題,邀請他們提出改進建議,而不是提高我對「積分」的微薄計數。

羅馬人建議函數體(),我從來沒有聽說過。下面是body()確實給f

f <- function(x = 1){x^2} 

> body(f) 
{ 
    x^2 
} 

大括號是不必要的,所以我搜索遠一點。我設法擺脫大括號與此:

> gsub(' {2,}','',deparse(body(f))[2]) 
[1] "x^2" 

因此,上述,回答我自己的問題。但是,有沒有更優雅更短的方式?

繼羅馬的建議,使用body(),我碰到這個優秀的答案走過來joran,哈德利,和其他幾個人,其中有一個模板爲我提供:

How to create an R function programmatically?

在那裏,它解釋瞭如何創建一個功能以編程方式從參數列表,主體和環境。因此,我決定用這3個基元構造函數f,並從閃亮的textInput內部調用主體。

所以我把這個在我的global.R文件(小盤g是簡寫全球)

# Convenience function 
make.function <- function(args = alist(a = 1, b = 2), body = quote(a + b), 
          env = parent.frame()) { 
    subs <- list(args = as.pairlist(args), body = body) 
    eval(substitute(`function`(args, body), subs), env) 
} 
gArg <- alist(a = 1, b = 2) 
gBody <- quote(a + b) 
gFun <- make.function(gArg, gBody) 

然後在我server.R文件,我有:

textInput(inputId = "inFun", label = h4("1. Enter a function:"), 
      value = deparse(body(gFun))) 

和它的作品!

我打算寫value = gBody或者其他的一些,但我的第一個成功來自deparse(body(gFun)),所以這就是我現在使用的。

採用make.functionglobal.R產生一個「靜態」的功能當然是矯枉過正,但我​​使用make.functionserver.R別處處理用戶提供的參數和身體創造新的功能和繪製出來,所以它的一個非常有用的功能。

感謝羅馬:如果你寫你自己的答案,我會接受你的。

相關問題