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

use*_*531 8 r

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

有人能说明怎么做吗?

Rol*_*and 10

您可以使用包功能:

library(functional)
fun <- Compose(function(x) x^2 + 9*x + log(x), exp)
fun(1)
#[1] 22026.47
Run Code Online (Sandbox Code Playgroud)

  • @SuperBiasedMan请停止发布这些无用的评论. (8认同)
  • @SuperBiasedMan请考虑使用评论自动评论更多限制.虽然通用注释通常可以作为问答的建设性补充,但是注释无法识别需要冗长解释的代码与通常不会帮助改进StackOverflow上的内容的代码之间的差异.;) (5认同)

Jos*_*ien 7

这是一种方法:

test <- function(e) {
    ee <- substitute(e)
    eee <- substitute(exp(X), list(X=ee))
    f <- function(x) {}
    body(f) <- eee
    environment(f) <- parent.frame()
    f
}

## Check that it works
m <- test(x^2 + 9*x + log(x))
m
# function (x) 
# exp(x^2 + 9 * x + log(x))
m(1)
# [1] 22026.47
m(1) == exp(10)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)


raw*_*awr 3

编辑 - 对于有问题的功能

f <- function(...) {
  l <- eval(substitute(alist(x = x, ...)))
  l[[2]] <- substitute(exp(X), list(X = l[[2]]))
  as.function(`names<-`(l, l[sapply(l, is.symbol)]))
}

g <- f(x^2 + 2*x + 5)
# function (x = x) 
#   exp(x^2 + 2 * x + 5)

g(1)
# [1] 2980.958
Run Code Online (Sandbox Code Playgroud)

对于一般情况,这是另一种方法:

f <- function(...) {
  l <- eval(substitute(alist(...)))
  as.function(`names<-`(l, l[sapply(l, is.symbol)]))
}

g <- f(x, x^2 + 9*x + log(x))

# function (x = x) 
#   x^2 + 9 * x + log(x)

g(10)
# [1] 192.3026
Run Code Online (Sandbox Code Playgroud)

这个版本也适用于任意数量的变量,只需在函数后面定义它们:

g <- f(x, y, z, x + 2 * y + z ** 3)

# function (x = x, y = y, z = z) 
#   x + 2 * y + z^3

g(1, 2, 0)
# [1] 5
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来添加...功能,但您可以这样做

f <- function(..., use_dots = FALSE) {
  l <- eval(substitute(alist(...)))
  if (use_dots)
    l <- c(head(l, -1), list('...' = as.symbol('...')), tail(l, 1))
  as.function(`names<-`(l, l[sapply(l, is.symbol)]))
}
Run Code Online (Sandbox Code Playgroud)

所以现在您不必命名所有变量/参数

g <- f(x, y, plot(x, y, ...), use_dots = TRUE)
g(1:5, 1:5, main = 'main title', pch = 16, col = 3, cex = 3, xpd = NA)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述