2015-04-02 26 views
2

我是比較新的R和我想做到以下幾點: 如果我寫一個簡單的功能把一個字符串轉換成一個功能線中的R

fn<-function(K) K^2 

,然後計算fn(10),我得到100

現在,如果K^2在某處作爲字符串創建,t1="K^2",那麼顯然我的函數不再工作了,因爲它不會將K作爲變量。

如何將字符串,字符序列轉換爲函數中的一行?

我不想使用eval(parse(text=t1)),因爲我想稍後在另一個函數中使用我的函數,比如說使用n1.grad(x0,fn)來查找梯度。

感謝, 亞辛

+1

有可能是這一個選擇。這似乎是不好的做法,幾乎不可能調試。當你處理多個參數/參數 – masfenix 2015-04-02 21:03:12

回答

5

你並不需要使用eval (parse())但你需要使用parse,因爲翻譯的文本語法可以接受的(但不計算)解析樹是什麼解析時。有三個可以修改的函數組件:arglist,body和environment,它們每個都有一個賦值函數。在這裏,我們只是修改了身體與body<-

?`function` 
?`body<-` 

fn <- function(K) {} 
t1="K^2" 
body(fn) <- parse(text=t1) 
fn 
#---------- 
function (K) 
K^2 

而且總是有:

fortunes::fortune(106) 
+1

時,如果't1'來自不可信源,你可能不應該評估它,因爲它可能很容易包含'unlink(「/」,TRUE ,TRUE)'或者其他的。 – BrodieG 2015-04-02 21:17:42

+0

哎。或者一些'system()'調用。 – 2015-04-02 21:20:36

+0

你會爲我的學習目的添加一個arglist和環境的例子嗎?謝謝 – Sathish 2015-04-02 21:21:27

相關問題