Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 - Fatal编程技术网

在R中定义一个新函数并按名称调用另一个函数

在R中定义一个新函数并按名称调用另一个函数,r,function,R,Function,我用一个函数(按名称)作为参数定义了一个新函数,但导数不起作用。发生了什么事?。代码是 myfun = function(f, a){ fx = function(x) f(x) print(fx(a)) # = f(a) OK fp = function(x) eval( D(expression(fx), "x") ) fp(a) # = 1/2*sqrt(a) doesn't work! }

我用一个函数(按名称)作为参数定义了一个新函数,但导数不起作用。发生了什么事?。代码是

myfun = function(f, a){
          fx = function(x) f(x)
          print(fx(a)) # = f(a) OK
          fp = function(x) eval( D(expression(fx), "x") )
          fp(a) # = 1/2*sqrt(a) doesn't work!
        }
        myfun(sqrt, 4) 
      # console-------------------------------------------
       > myfun(sqrt, 4) # = 1/2*sqrt(4) = 1/4
       [1] 2
       [1] 0


我在中找到了我问题的答案:

我可以通过几种方式修改代码:

  # 1. ----------------------------------- 
  myfun = function(f, a){
        g  = parse(text=f)     # f is string
        # fx = function(x){eval(g[[1]])}
        g. = D(g,"x")
        fp = function(x){eval(g.)}
        fp(a)
                        }
  myfun('sqrt(x)', 4) # 0.25

# 2. ----------------------------------- 
fa = function(x){sqrt(x)}   # with { }
fb = function(x) sqrt(x)    # without { }

my2fun = function(f, a){
          if(body(f)[[1]]== '{' ){ 
               g. = D(body(f)[[2]], "x")
          } else {
                   g. = D(as.expression(body(f)), "x")  
                 }
  fp = function(x){eval(g.)}
  fp(a)
}
my2fun(fa, 4) # 0.25

 # 3. And more general
fa = function(x){sqrt(x)}    # with { }
fb = function(x) sqrt(x)     # no { } 
lafun = function(f, a){
  # add { }
  if(body(f)[[1]]!= '{' ) body(f) = call("{", body(f))     
  g. = D(body(f)[[2]], "x")  
  fp = function(x){eval(g.)}
  print(f(a))
  print(fp(a))
}
lafun(fa, 4) 
lafun(fb, 4) 
# 0.25
# 0.25
我需要这段代码,因为我正在用R进行数值计算。

我认为
D(表达式(fx),“x”)
在这种情况下不起作用。在本例中,这不是称为“x”的变量。