2017-06-27 45 views
4

我想避免在包含polynomial()的函數定義中使用parse()我可以避免在R中用`polynomial()`定義函數的`eval(parse())`嗎?

我的多項式是這樣的:

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

似乎還有爲'˚F<功能 - as.function(多項式(C(1,2)))' – user20650

+1

@ user20650謝謝! – pidosaurus

回答

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 
+1

如果你寫了'function(x,p = pol){'這會更加普遍並且仍然成功。 –

+0

好吧,似乎我問錯了問題。 :D謝謝!我想把多項式函數給予'polynomial()'函數。看來使用'eval(parse())'是唯一的方法(或者使用你的函數並計算相應的數據點)。最小工作示例:'library(ggplot2);庫(多項式); p < - ggplot(data = data.frame(x = 0),mapping = aes(x = x)); p + stat_function(fun = eval(parse(text = paste0('function(x)',(polynomial(c(1,2,3))))))+ xlim(-50,50)' – pidosaurus

+1

pff so複雜。對不起,我暫時「不接受」答案,因爲我剛剛發現我可以在'stat_function()'中使用'as.function'。如此迷茫。是的,我知道,但我使用h'多項式「在」曲線「中」生成「表達式。 – pidosaurus

3

和你一樣,雖然多項式函數返回一個R表達式,但我們都是錯誤的。閱讀幫助索引包:多項式會幫助我們倆:

str(pol) 
#Class 'polynomial' num [1:2] 1 2 
help(pac=polynom) 

所以user20650是正確的:

> poly_function <- as.function(pol) 
    > poly_function(10) 
    [1] 21 

因此,這是作者(維納布爾斯,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的加載名稱空間中撬出它。

+0

非常感謝! 'as.function()'是我將使用的,我不知道'getAnywhere()'。我想用ggplot多項式函數進行繪圖。最小工作示例:'library(ggplot2);庫(多項式); p < - ggplot(data = data.frame(x = 0),mapping = aes(x = x)); p + stat_function(fun = as.function(polynomial(c(1,2,3))))+ xlim(-50,50)' – pidosaurus

+1

新增對評論的迴應, –

相關問題