R 返回一个函数';s代码
这似乎是一个基本问题,但我似乎找不到关于stackoverflow的答案 如何获得以下效果: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
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)))