我想避免在包含parse()
的函数定义中使用polynomial()
。
我的多项式是:
library(polynom)
polynomial(c(1, 2))
# 1 + 2*x
我想创建一个使用此多项式表达式的函数,如:
my.function <- function(x) magic(polynomial(c(1, 2)))
magic()
的位置,我尝试了expression()
,formula()
,eval()
,as.character()
等的各种组合......但似乎没有任何效果。
我唯一可行的解决方案是使用eval(parse())
:
eval(parse(text = paste0('poly_function <- function(x) ', polynomial(c(1, 2)))))
poly_function(x = 10)
# 21
有没有更好的方法可以做我想要的?我可以避开eval(parse())
吗?
答案 0 :(得分:3)
和你一样,我虽然多项式函数返回了一个R表达式,但我们都错了。阅读帮助索引包:polynom会帮助我们两个:
str(pol)
#Class 'polynomial' num [1:2] 1 2
help(pac=polynom)
所以user20650是正确的,并且:
> poly_function <- as.function(pol)
> poly_function(10)
[1] 21
所以作者(Venables,Hornick,Maechler)就是这样做的:
> getAnywhere(as.function.polynomial)
A single object matching ‘as.function.polynomial’ was found
It was found in the following places
registered S3 method for as.function from namespace polynom
namespace:polynom
with value
function (x, ...)
{
a <- rev(coef(x))
w <- as.name("w")
v <- as.name("x")
ex <- call("{", call("<-", w, 0))
for (i in seq_along(a)) {
ex[[i + 2]] <- call("<-", w, call("+", a[1], call("*",
v, w)))
a <- a[-1]
}
ex[[length(ex) + 1]] <- w
f <- function(x) NULL
body(f) <- ex
f
}
<environment: namespace:polynom>
由于您在评论中提到getAnywhere是新的,因此您可以通过查看“运行”来使用它来获得。如果在控制台提示符下键入函数名称,则会获得代码,在这种情况下:
> as.function
function (x, ...)
UseMethod("as.function")
<bytecode: 0x7f978bff5fc8>
<environment: namespace:base>
在你跟进之前,这是无益的。
> methods(as.function)
[1] as.function.default as.function.polynomial*
see '?methods' for accessing help and source code
polynomial
版本末尾的星号表示代码未“导出”,即只需键入即可在控制台上找到。因此,您需要使用getAnywhere
从加载的命名空间中删除它。
答案 1 :(得分:2)
您似乎也可以轻松编写自己的功能
poly_function = function(x, p){
sum(sapply(1:length(p), function(i) p[i]*x^(i-1)))
}
# As 42- mentioned in comment to this answer,
# it appears that p can be either a vector or a polynomial
pol = polynomial(c(1, 2))
poly_function(x = 10, p = pol)
#[1] 21
#OR
poly_function(x = 10, p = c(1,2))
#[1] 21