【问题标题】:Defining a new function calling another function by name in R在 R 中定义一个按名称调用另一个函数的新函数
【发布时间】:2015-03-12 01:28:16
【问题描述】:

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

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

【问题讨论】:

  • 我认为D(expression(fx), "x") 在这种情况下不会起作用。在这种情况下,这不是称为“x”的变量。

标签: r function


【解决方案1】:

我在R type conversion expression() function() 中找到了我的问题的答案。

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

  # 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 研究数值方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多