在R中查找函数的派生

时间:2017-11-06 06:04:48

标签: r

我正在使用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; 有什么方法可以构建函数吗?

4 个答案:

答案 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)

假设:

  • 作为参数传递的函数具有单行主体和
  • 如果未指定x,则默认为输入函数
  • 的第一个参数的名称

然后我们可以写

test3 <- function(fun, x = names(formals(fun))[1]) D(body(fun), x)

test3(function(x) x^2)
## 2 * x