首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于重命名函数的问题

关于重命名函数的问题
EN

Stack Overflow用户
提问于 2020-10-13 19:03:20
回答 2查看 61关注 0票数 3

我正在编写一些代码来计算函数的导数。我设法为1个变量生成了1和2的导数,并将它们作为函数存储在环境中,这样以后我就可以绘制它们了。现在,我试图计算含有2个或更多变量的方程的部分导数,但我找不到在环境中生成函数的代码和函数的偏导数一样多。

为了澄清,我使用了一个变量:

代码语言:javascript
复制
    f <- function(x) cos(20*x)*exp(-1*x)
    F.<- function (x) eval(D(as.expression(body(f)), "x"))
    F..<- function (x) eval(D(as.expression(D(as.expression(body(f)), "x")),"x"))

它工作得很好,我得到了环境中的三个功能:

但是对于一个以上的变量,我必须循环这个函数,生成和方程的偏导数一样多的函数。

我的问题是:如何生成一个循环来计算函数的偏导数并将其存储为函数,每个函数都有一个自定义名称?

我在for循环中尝试了导数函数,但无法为每次计算导数定义不同的名称:

代码语言:javascript
复制
    for (i in 1:nro_variables) {
      var_D = vector_variables[i]  
      F.<- function (x) eval(D(as.expression(body(f)), var_D))
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-17 16:12:54

类似于避免使用分配许多单独的相似对象来淹没您的全局环境,请考虑使用单个列表来索引元素以获得更好的串行组织。请参阅@GregorThomas的最佳实践answer倡导:

从来没有创建过d1 d2 d3,.,dn。使用d元素创建一个列表n

具体来说,如果vector_variables是一个字符向量,使用simplify=FALSEsapply将返回一个命名的函数列表。是的,列表中的函数仍然可以调用。

代码语言:javascript
复制
partial_deriv_funcs <- sapply(vector_variables, function(var_D) {
    f <- function(x) cos(20*x)*exp(-1*x)
    return(function(x) eval(D(as.expression(body(f)), var_D)))
}, simplify = FALSE)

奇数地或迭代地调用函数元素:

代码语言:javascript
复制
# CALL SINGLE FUNCTION WITH SINGLE PARAM
result <- partial_deriv_funcs[['var1']](param)

# CALL SAME FUNCTION WITH VECTOR OF PARAMS
results <- lapply(param_vector, partial_deriv_funcs[['var1']])

# CALL ALL FUNCTIONS USING SAME PARAM
results <- lapply(partial_deriv_funcs, function(f) f(param))

# CALL ALL FUNCTIONS EACH WITH DIFFERENT PARAM
results <- mapply(function(f,p) f(p), partial_deriv_funcs, param_per_func_vector, SIMPLIFY= FALSE)
results <- Map(function(f,p) f(p), partial_deriv_funcs, param_per_func_vector) # EQUIVALENT
票数 2
EN

Stack Overflow用户

发布于 2020-10-17 14:32:25

evalparse可以用来定义函数,assign可以给它正确的名称。

代码语言:javascript
复制
f <- function(x) 2 * x
g <- function(x, y) x * y
h <- function(x, y, z) x * y + z

fns <- c("f", "g", "h")

for (fn in fns) {
  for (variable in formalArgs(fn)) {
    function_name <- glue::glue("{toupper(fn)}.{variable}")
    fn_definition <- eval(parse(text = glue::glue("function({paste0(formalArgs(fn), collapse = ',')}) eval(D(as.expression(body({fn})), '{variable}'))")))

    assign(
      function_name,
      fn_definition
    )
  }
}

ls.str(mode = "function")
#> f : function (x)  
#> F.x : function (x)  
#> fn_definition : function (x, y, z)  
#> g : function (x, y)  
#> G.x : function (x, y)  
#> G.y : function (x, y)  
#> h : function (x, y, z)  
#> H.x : function (x, y, z)  
#> H.y : function (x, y, z)  
#> H.z : function (x, y, z)  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64341602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档