相关疑难解决方法(0)

如何调用`function`函数?

我试图调用函数`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

26
推荐指数
2
解决办法
848
查看次数

在R中手动构造函数

作为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语法构造,但也存在一个以functionR 命名的函数.我遇到的问题是函数的未评估定义将包含一个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)

expression r function

11
推荐指数
1
解决办法
782
查看次数

as.alist.character?

我希望从字符串创建一个调用对象.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)在我的(地狱)圈子中不受欢迎; 你能建议更好吗?

谢谢.

r

9
推荐指数
1
解决办法
168
查看次数

R:从字符串定义函数

我想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

9
推荐指数
1
解决办法
3263
查看次数

传入函数作为输入和返回功能

我想编写一个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).

有人能说明怎么做吗?

r

8
推荐指数
3
解决办法
662
查看次数

在将函数传递给其他函数之前构建函数

我的目标是获取通过省略号传递的附加参数...(请参阅?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)

parameters r function ellipsis

8
推荐指数
1
解决办法
227
查看次数

R - 评估环境中的嵌套函数

我试图通过将所有必要的依赖项(函数和数据)加载到新环境中并在该环境中评估表达式,以沙盒方式运行一大块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)

使用evalon 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呼叫排列.有没有办法在不附加环境的情况下获得相同的效果?

eval r function

7
推荐指数
2
解决办法
1846
查看次数

在R中捕获表达式作为函数体

我正在尝试编写一个程序,它将表达式作为输入,并返回一个函数,该表达式绑定为它的主体.

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上看到了类似的问题,但解决方案似乎并不能解决这个问题.

eval r metaprogramming substitution

6
推荐指数
1
解决办法
503
查看次数

使用可选的非默认参数以编程方式创建 R 函数

如何以编程方式创建 R 函数?

我想从它们的组件构建 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)

r

5
推荐指数
1
解决办法
2071
查看次数

返回函数的代码

这似乎是一个基本问题,但我似乎无法在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)

parsing r shiny

4
推荐指数
1
解决办法
158
查看次数