我可以避免在E中使用`polynomial()`定义一个函数的`eval(parse())`吗?

时间:2017-06-27 20:47:46

标签: r

我想避免在包含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())吗?

2 个答案:

答案 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