我想写一个R函数,它在x
中接受一个数学函数,并在x
中返回一个新函数作为输出。例如:
输入应作为x
中的数学函数(或关系)传递:
g <- x^2 + 9*x + log(x)
结果输出应为:
function(x) (exp(g))
即。我想在x
中返回原始函数的符号指数表达式,即exp(x^2 + 9*x + log(x))
在此说明性示例中
理想情况下,它会返回函数对象:
function(x) (exp(x^2 + 9*x + log(x)))
我尝试如下:
test <- function(g){
h <- function(x){exp(g)}
return(h)
}
m <- test(x^2 + 9*x + log(x))
m(10)
所以m(10)应该返回:
exp(10^2 + 9*10 + log(10))
在这种情况下是exp(192.3026)。
有人能说明怎么做吗?
答案 0 :(得分:10)
您可以使用包功能:
library(functional)
fun <- Compose(function(x) x^2 + 9*x + log(x), exp)
fun(1)
#[1] 22026.47
答案 1 :(得分: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
答案 2 :(得分: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
以下是一般情况的另一种方式:
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
此版本也适用于任意数量的变量,只需定义它们后跟函数:
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
可能有更好的方法可以将...
添加到函数中,但是这里有你如何做到这一点
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)]))
}
所以现在你不必命名所有变量/参数
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)