在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”的变量。