2012-12-06 34 views
4

我希望有一個R函數,它允許我模擬R控制檯,不同之處在於表達式在與全局環境不同的環境中進行評估。 (我想在R中使用它作爲替代調試方法,它允許恢復調用函數的本地參數,然後通過將功能代碼逐步粘貼到仿真R控制檯中進行調試)。下面是一個使用解析和eval和做這項工作中途功能(模擬的控制檯按下Esc鍵時停止):在R /仿真R控制檯中解析多行表達式

my.console = function() { 
    while(TRUE) { 
    tryCatch({ 
     expr.out <- capture.output(eval(parse(prompt=": "))) 
     if (length(expr.out)>0) { 
     cat(expr.out,"\n") 
     } 
    }, error = function(e) { 
     str = as.character(e) 
     message(str) 
    }) 
    } 
} 

console.env = new.env(parent=globalenv()) 
console.env$hello = "Hello World" 
environment(my.console) <- console.env 

my.console() 

一個然後可以在模擬控制檯,例如計算簡單表達式

: 5*5 
[1] 25 
: hello 
[1] "Hello World" 

問題是我無法解析多行代碼,當從我的腳本粘貼if語句的開始時,會拋出錯誤。

: if (TRUE) { 
Error in parse(prompt = ": "): 2:0: unexpected end of input 

R控制檯意識到更多代碼將在下一行中執行並將提示更改爲+。我想知道是否也有類似行爲的解析函數的變體。 到目前爲止,我唯一的想法是在錯誤消息中搜索子串「意外的輸入結束」,以及是否發現它繼續解析。但例如因爲一些R錯誤消息似乎取決於R運行的語言,所以我對這種方法並不滿意。有沒有人知道我該如何編寫一個更好的仿真R控制檯來解析多行R代碼?

回答

0

如果要交互式地逐步執行代碼,可以使用內置函數browser()和命令n,請參閱?browser。使用示例:

f <- function(x) { 
    # invoke interactive debugging 
    browser() 

    # rest of the function - by pressing 'n' while in browser mode, the expressions 
    # will be executed one after another and you are able to explore the 
    # intermediate values of variables etc. (as in standard R promt) 
    y <- x^2 
    [...] 
} 

如果這個不適合你的需求,你可能有一個看的browser的源代碼。

+0

感謝您的建議,但我的目標是爲調試提供一種替代方法,我在CRAN包restorepoint實現。封裝小插曲詳細描述了它,爲什麼我更喜歡它通過browser()設置的斷點。到目前爲止,該軟件包似乎與我的骯髒的解決方法一起工作......但如果在R中有一種更簡潔的方式來模擬解析多行表達式的自定義控制檯,那將會很不錯。 –

1

爲什麼不試試你的分離編碼輸入和parse命令,例如,

s <- scan(what="list", multi.line=TRUE) 
for(i in 1:length(s)){ 
    capture.output(eval(parse(text=s)[i])) 
    # etc... 
} 
+0

感謝您的建議,但像在R控制檯中一樣,我希望一旦輸入完整的R表達式,就應立即進行評估。爲了使掃描停止,似乎必須明確地輸入空行。此外,似乎並不直接評估多行表達式,我得到一個錯誤。到目前爲止,我寧願留在我上面描述的檢查R eror消息的骯髒的方法。 –

+0

您是否需要輸入任意數量的行? 'scan'接受'nlines'參數,這樣就不必輸入空行來停止掃描。 – Thomas

+0

設置nlines = 1可能會有所幫助,但仍然會有問題來檢測第一行是否是多行表達式的開始並正確解析整個表達式 –