我试图调用函数`function`
来定义R代码中的函数.
正如我们所知道`function`
的.Primitive
那样,R 是在内部由R用来在用户使用传统语法时定义函数,即
mean1 = function (x, ...) base::mean(x, ...)
Run Code Online (Sandbox Code Playgroud)
但没有什么可以阻止我直接调用这个原语.或者我想.我可以直接调用其他原语(甚至重新定义它们;例如,在疯狂的时刻我覆盖了R的内置`for`
).所以原则上这是可能的.
然而,我无法让它工作`function`
.这是我试过的:
# Works
mean2 = as.function(c(formals(mean), quote(mean(x, ...))))
# Works
mean3 = eval(call('function', formals(mean), quote(mean(x, ...))))
# Error: invalid formal argument list for "function"
mean4 = `function`(formals(mean), quote(mean(x, ...)))
Run Code Online (Sandbox Code Playgroud)
mean3
特别是作品的事实向我表明mean4
应该有效.但事实并非如此.为什么?
我检查了`function`
R源中基元的定义.do_function
定义于eval.c
.我看到它调用CheckFormals
,它确保每个参数都是一个符号,这就失败了.但为什么要检查这个,这是什么意思?
最重要的是:有没有办法`function`
直接调用原语?
只是为了澄清:有一些简单的解决方法(这个问题列出了两个,至少有三分之一).但我想了解这(不)是如何工作的.
作为R是函数式语言的症状,可以使用纯函数符号指定许多控制结构.例如,if语句:
> as.list((substitute(if(a == 1) 1 else 2)))
[[1]]
`if`
[[2]]
a == 1
[[3]]
[1] 1
[[4]]
[1] 2
> as.list(substitute(`if`(a == 1, 1, 2)))
[[1]]
`if`
[[2]]
a == 1
[[3]]
[1] 1
[[4]]
[1] 2
Run Code Online (Sandbox Code Playgroud)
出于好奇,我试图对函数定义做同样的事情.函数通常使用function(args) body
语法构造,但也存在一个以function
R 命名的函数.我遇到的问题是函数的未评估定义将包含一个pairlist:
> substitute(function(x = 1, a) {x + a})[[2]]
$x
[1] 1
$a
[empty symbol]
Run Code Online (Sandbox Code Playgroud)
第二个参数是参数名称和默认值之间的一个参数,它们可能是空符号.据我所知,仅使用手动调用就不可能将列表或pairlist作为表达式的一部分传递.以下是我的尝试:
> substitute(`function`(x, {x + 1}))
Error: badly formed function expression
> substitute(`function`((x), {x + 1}))
function(`(`, x) {
x + …
Run Code Online (Sandbox Code Playgroud) 我希望从字符串创建一个调用对象.alist()
,在交互式(手动输入)模式下或多或少地做了我想要的东西,似乎没有强制方法,也没有as.call
做我希望的.
考虑以下代码,
string = "<<mychunk, cache=TRUE, fig.show=hold, dev=png, echo=c(1,3)>>="
sanitized = gsub("<<|>>=", "", string)
## as.call(sanitized)
## as.alist(sanitized)
as.alist.character <- function(x)
eval(parse(text = paste("alist(", x, ")")))
as.alist.character(sanitized)
Run Code Online (Sandbox Code Playgroud)
现在,eval(parse)
在我的(地狱)圈子中不受欢迎; 你能建议更好吗?
谢谢.
我想f
从参数和表达式定义一个函数,这个函数是character
从.csv
文件中读取的字符串.该函数f
具有以下表达式:
f = function( parameters ) { expression }
Run Code Online (Sandbox Code Playgroud)
其中参数是n个参数的列表,表达式是这些参数的函数.例如:参数是x1
,x2
,x3
,和表达是(x1+x2)*x3
.f
那么功能就是f = function(x1,x2,x3){ (x1+x2)*x3 }
.我如何继续R来定义这样的功能?
给出2个charcaters字符串,用于正文和参数
body="(x1+x2)*x3"
args = "x1,x2,x3"
Run Code Online (Sandbox Code Playgroud)
我们怎么能得到?:
function (x1, x2, x3)
(x1 + x2) * x3
Run Code Online (Sandbox Code Playgroud)
请注意,这个问题很相似,但不能完全回答这个问题,因为提出的解决方案不会从字符串创建函数formals(arguments).
我想编写一个R函数,它接受一个数学函数x
并返回一个新函数x
作为输出.例如:
输入应作为数学函数(或关系)传入x
:
g <- x^2 + 9*x + log(x)
Run Code Online (Sandbox Code Playgroud)
结果输出应该是:
function(x) (exp(g))
Run Code Online (Sandbox Code Playgroud)
即我想回到原来的功能的象征性指数表达x
,即exp(x^2 + 9*x + log(x))
在这个说明性的例子
理想情况下它会返回函数对象:
function(x) (exp(x^2 + 9*x + log(x)))
Run Code Online (Sandbox Code Playgroud)
我尝试如下:
test <- function(g){
h <- function(x){exp(g)}
return(h)
}
m <- test(x^2 + 9*x + log(x))
m(10)
Run Code Online (Sandbox Code Playgroud)
所以m(10)应该返回:
exp(10^2 + 9*10 + log(10))
Run Code Online (Sandbox Code Playgroud)
在这种情况下是exp(192.3026).
有人能说明怎么做吗?
我的目标是获取通过省略号传递的附加参数...
(请参阅?dots
参考资料 获取更多信息),并使用已设置的参数构建一个新的通用函数,并将其传递给另一个函数。
例如,给定两个函数:
foo <- function(v, FUN, ...) {
## code here to build NEWFUN
SomeFun(v, NEWFUN)
}
bar <- function(v, FUN) {
SomeFun(v, FUN)
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在以下位置执行此操作foo
:
bar(x, FUN = \(x) paste(x, collapse = ", "))
Run Code Online (Sandbox Code Playgroud)
通过调用foo(x, paste, collapse = ", ")
.
我们从一个简单的函数开始,它采用一个基R
函数(此处paste
)并将其应用于向量。请注意,我试图使其尽可能简单,因此我删除了健全性检查。另外,我写这个只是为了用基本R
函数来演示paste
。
FunAssign <- function(f, x) f(x)
Run Code Online (Sandbox Code Playgroud)
这是我天真的尝试:
foo <- function(v, FUN, ...) {
FUN <- \(x) FUN(x, ...)
FunAssign(FUN, v)
} …
Run Code Online (Sandbox Code Playgroud) 我试图通过将所有必要的依赖项(函数和数据)加载到新环境中并在该环境中评估表达式,以沙盒方式运行一大块R代码.但是,我在调用环境中的其他函数时遇到了麻烦.这是一个简单的例子:
jobenv <- new.env(parent=globalenv())
assign("f1", function(x) x*2, envir=jobenv)
assign("f2", function(y) f1(y) + 1, envir=jobenv)
expr <- quote(f2(3))
Run Code Online (Sandbox Code Playgroud)
使用eval
on expr
失败,因为f2
找不到f1
> eval(expr, envir=jobenv)
Error in f2(3) : could not find function "f1"
Run Code Online (Sandbox Code Playgroud)
而明确附加环境是有效的
> attach(jobenv)
> eval(expr)
[1] 7
Run Code Online (Sandbox Code Playgroud)
我可能错过了一些明显的东西,但我找不到任何有效的eval
呼叫排列.有没有办法在不附加环境的情况下获得相同的效果?
我正在尝试编写一个程序,它将表达式作为输入,并返回一个函数,该表达式绑定为它的主体.
caller <- function (expr, params) {
Function <- function (params, body, env = parent.frame()) {
# returns a function
}
Function(params, body = expr)
}
func <- caller (a + b, c('a', 'b'))
func(1, 2)
[1] 3
Run Code Online (Sandbox Code Playgroud)
我可以通过使用类似的东西很容易地绑定参数
params <- c('a', 'b')
f <- function() {}
formals(f) <- structure(
replicate(length(params), NULL),
names = params
)
Run Code Online (Sandbox Code Playgroud)
我无法想出一种动态添加表达式作为正文的方法.我已经尝试过使用substitute(),并从pryr库中调整make_function,但是我无法完成任务.我最好的尝试是
body(f, parent.frame()) <- as.list( match.call() )[-1]$body
Run Code Online (Sandbox Code Playgroud)
我也无法用替代品来解决这个问题.关于如何绑定主体以使最顶层的程序按预期工作的任何想法?
我在SO上看到了类似的问题,但解决方案似乎并不能解决这个问题.
我想从它们的组件构建 R 函数,如下所示:
testfn <- function(..., expression){
args <- substitute(alist(...))
body <- substitute(expression)
eval(call("function", as.pairlist(eval(args)), body), parent.frame())
}
Run Code Online (Sandbox Code Playgroud)
如果有默认值,这可以正常工作:
testfn(x = 4, y = 5, expression = {
y <- y + 2
x + y
})
=>
function (x = 4, y = 5)
{
y <- y + 2
x + y
}
Run Code Online (Sandbox Code Playgroud)
但如果一个或多个参数没有默认参数,它将不起作用:
testfn(x = 4, y, expression = {
y <- y + 2
x + y
})
=>
Error in eval(expr, …
Run Code Online (Sandbox Code Playgroud) 这似乎是一个基本问题,但我似乎无法在stackoverflow上找到答案.
如何获得以下效果:
f <- function(x = 1){x^2}
miracle(f)
[1] "x^2"
Run Code Online (Sandbox Code Playgroud)
上下文是一个闪亮的应用程序(由RStudio打包),其中我有一个textInput()
函数,我提供了一个初始值x^2
.虽然这有效:
textInput(inputId = "inFun", label = h4("Enter a function:"), value = "x^2")
Run Code Online (Sandbox Code Playgroud)
这不是:
textInput(inputId = "inFun", label = h4("Enter a function:"), value = f)
Run Code Online (Sandbox Code Playgroud)
似乎我需要在价值的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) …
Run Code Online (Sandbox Code Playgroud) r ×10
function ×3
eval ×2
ellipsis ×1
expression ×1
parameters ×1
parsing ×1
shiny ×1
substitution ×1