我正在使用R并尝试通过提供2个函数和x的参数来创建函数,尝试寻找函数的答案。但我不断收到错误。我不想只使用R base的任何包。 到目前为止,这是守则。
test2 <- function(x) {
func <- expression(x)
der<- D(eval(func), 'x')
return(der(x))
}
test2(function(x) return(x^2))
我一直收到这个错误:&#34;表达式不能是类型&#39;关闭&#39;&#34; 有什么方法可以构建函数吗?
答案 0 :(得分:1)
这里稍作调整以使派生功能起作用:
test2 <- function(x) D(parse(text=x), "x")
test2("sin(cos(x + y^2))")
# -(cos(cos(x + y^2)) * sin(x + y^2))
test2("x^2")
# 2 * x
test2("x^3")
# 3 * x^2
答案 1 :(得分:1)
使用substitute
将表达式传递给D
:
test2 <- function(e, d) D(substitute(e), deparse(substitute(d)))
test2(sin(cos(x + y^2)), x)
#-(cos(cos(x + y^2)) * sin(x + y^2))
您无法将函数传递给D
,因为它是为符号化创建衍生函数而设计的,这意味着它需要包含D
已知的简单函数的表达式。
答案 2 :(得分:0)
函数f
返回一个字符向量,string_der
给出导数。 (我在里面使用了字符串操作,因为它似乎想传递一个参数。)
string_der <- function(x) {
D(parse(text = x), "x")
}
library(stringr)
f <- function(x) {
str <- "sin(cos(z + y^2))"
str <- str_replace(str, "z", x)
return(str)
}
string_der(f(x = "x"))
# -(cos(cos(x + y^2)) * sin(x + y^2))
我想以下几乎就是Adam Queck所做的。它使用quote
并让您传递quote
中包含的对象。
quote_der <- function(x) {
D(eval(x), 'x')
}
f <- function(x) {
qt <- substitute(expression(sin(cos(z + y^2))), list(z = x))
return(qt)
}
quote_der(f(x = quote(x)))
#-(cos(cos(x + y^2)) * sin(x + y^2))
答案 3 :(得分:0)
假设:
然后我们可以写
test3 <- function(fun, x = names(formals(fun))[1]) D(body(fun), x)
test3(function(x) x^2)
## 2 * x