Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 作为输入和返回函数的传入函数_R - Fatal编程技术网

R 作为输入和返回函数的传入函数

R 作为输入和返回函数的传入函数,r,R,我想写一个R函数,它在x中取一个数学函数,并在x中返回一个新函数作为输出。例如: 输入应作为数学函数(或关系)传入x: g <- x^2 + 9*x + log(x) i、 e.我想返回x中原始函数的符号指数表达式,即在这个示例中exp(x^2+9*x+log(x)) 因此理想情况下,它将返回函数对象: function(x) (exp(x^2 + 9*x + log(x))) 我做了如下尝试: test <- function(g){ h <- function(x){e

我想写一个R函数,它在
x
中取一个数学函数,并在
x
中返回一个新函数作为输出。例如:

输入应作为数学函数(或关系)传入
x

g <- x^2 + 9*x + log(x)
i、 e.我想返回
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)
在本例中为exp(192.3026)

有人能告诉我怎么做吗?

这里有一种方法:

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

testedit-针对有问题的功能

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
因此,现在不必命名所有变量/参数

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)

g您可以使用软件包功能:

library(functional)
fun <- Compose(function(x) x^2 + 9*x + log(x), exp)
fun(1)
#[1] 22026.47
库(功能性)

有趣的是,这类似于符号差异,不是吗
deriv(expr,…)
No-此处不涉及区分。只想从作为输入传入的函数(即x^2+9*x+log(x))中创建/返回一个新的函数对象(即exp(10^2+9*10+log(10))。因此我写了“类似”。我知道你想要符号表达式的另一种转换。当然,在功能转换的意义上,它是类似的-yesYes@JoshO'Brien-你是对的。我的意思是“exp(192.3026)”。现在编辑完毕,谢谢!有关以编程方式构建函数的更多内容,请考虑编辑您的帖子,以添加更多关于代码所做的解释以及为什么它将解决问题的更多解释。一个主要包含代码的答案(即使它是工作的)通常不会帮助OP理解他们的问题。或者,您是否碰巧知道OP,并且知道只包含代码的答案(使用常见的和有良好文档记录的函数)对他们没有帮助?(在这种情况下,我的问题是——你能给我一些关于他们作为R用户的经验的建议吗,也许让他们联系我,提出他们自己的问题。)谢谢。我在应用程序中尝试了以下方法,但没有完全奏效:f我想返回exp(函数),然后取其导数。如果我能把这个方法推广到你的网站上,你能帮我吗work@user4687531把g换成x,它就会工作。变量需要匹配,否则函数不知道要使用什么,例如
test2,我认为这不符合预期。如果我执行y@user4687531,请参见编辑。在第一个版本中,你想通过代码> G来做这件事,请考虑编辑你的帖子,以进一步解释你的代码所做的以及为什么它会解决这个问题。一个主要包含代码的答案(即使它是工作的)通常不会帮助OP理解他们的问题。@ SubIdaseDeman请停止发布这些无用的评论。虽然一般注释通常可以作为问答的建设性补充,但无法识别需要冗长解释的代码与通常不需要解释的代码之间的差异的注释将无助于改进StackOverflow上的内容。;)
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)
library(functional)
fun <- Compose(function(x) x^2 + 9*x + log(x), exp)
fun(1)
#[1] 22026.47