Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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_Function_Derivative - Fatal编程技术网

R 关于重命名功能的问题

R 关于重命名功能的问题,r,function,derivative,R,Function,Derivative,我正在写一些代码来计算函数的导数。我设法为一个变量生成了一阶导数和二阶导数,并将其作为函数存储在环境中,以便以后绘制它们。现在我试图计算含有2个或更多变量的方程的偏导数,但我找不到在环境中可以生成与函数偏导数一样多的函数的代码 为了澄清,对于我使用的1个变量: f <- function(x) cos(20*x)*exp(-1*x) F.<- function (x) eval(D(as.expression(body(f)), "x"))

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

为了澄清,对于我使用的1个变量:

    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"))

f
eval
parse
可用于定义函数,而
assign
可为函数指定正确的名称

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)  
fg.y:函数(x,y)
#>h:函数(x,y,z)
#>H.x:函数(x,y,z)
#>H.y:函数(x,y,z)
#>H.z:函数(x,y,z)

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

首先不要创建
d1
d2
d3
,…,
dn
。创建一个包含
n
元素的
d
列表

具体来说,如果
vector\u variables
是字符向量,则使用
simplify=FALSE
sapply
将返回一个命名的函数列表。是的,列表中的函数仍然可以调用


partial_derivu_funcs你能举一个例子,说明一个函数有多个变量,以及你期望从该输入中得到的输出吗?这样就可以测试和验证可能的解决方案。@flick先生,是的。假设我将函数“f”定义为:f=-log(1-x-y)-log(x)-log(y)。它的偏导数是:F.=1/(1-x-y)-1/x相对于“x”,F.=1/(1-x-y)-1/y相对于“y”。我正试图将这两个方程以不同的名称存储在环境中(例如,对于“x”的偏导数为“F.x”,对于“y”的偏导数为“F.y”),谢谢@Parfait,它工作得很好!。我添加了一个For…循环来添加列表中每个元素的“Environment”值,并通过为偏导数选择的变量更改了默认值(vector_变量)。现在我可以打印微分方程,并用它来计算值和绘制它们。太棒了!很高兴听到这个消息,也很乐意帮忙。
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)