R 返回一个函数';s代码

R 返回一个函数';s代码,r,parsing,shiny,R,Parsing,Shiny,这似乎是一个基本问题,但我似乎找不到关于stackoverflow的答案 如何获得以下效果: f <- function(x = 1){x^2} miracle(f) [1] "x^2" 这并不是: textInput(inputId = "inFun", label = h4("Enter a function:"), value = f) 似乎我需要在值的rhs上显示类似“x^2”的内容 以下是我尝试过的几种变体的代表性示例: eval(parse(text = f)) Erro

这似乎是一个基本问题,但我似乎找不到关于stackoverflow的答案

如何获得以下效果:

f <- function(x = 1){x^2}
miracle(f)
[1]  "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

这有内置的功能吗

我想根据罗曼·卢什特里克的评论回答我自己的问题,征求改进建议,而不是提高我那微不足道的“分数”

Roman建议使用函数body(),这是我从未听说过的。以下是
body()
f
的作用:

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

> body(f)
{
    x^2
}
因此,以上回答了我自己的问题。但有没有更优雅、更短的方式呢

根据Roman建议使用
body()
,我找到了joran、hadley和其他几个人的杰出答案,他们为我提供了一个模板:

其中解释了如何从参数列表、主体和环境以编程方式创建函数。因此,我决定用这3个原语构造我的函数
f
,并从shiny的
textInput
内部调用函数体

所以我把它放在我的
global.R
文件中(小型
g
是global的缩写)

而且它有效

我本来打算写
value=gBody
或者类似的东西,但是我的第一个成功来自
deparse(body(gFun))
,所以我现在用的就是这个

使用
make.function
global.R
中生成一个“静态”函数当然有些过分,但我使用
make.function
server.R
中的其他地方来处理用户提供的参数和主体,以创建新函数并绘制它们,因此这是一个非常有用的函数


谢谢罗曼:如果你自己写答案,我会接受你的。

那么
正文(f)
?你能调整标题吗?没有把答案写在标题里?
f <- function(x = 1){x^2}

> body(f)
{
    x^2
}
> gsub(' {2,}','',deparse(body(f))[2])
[1] "x^2"
# 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)
textInput(inputId = "inFun", label = h4("1. Enter a function:"), 
          value = deparse(body(gFun)))