2016-12-24 103 views
2

parse是一個返回表達式的函數。這樣做通過解析或表達式定義表達式之間的區別

parse(text = "print('hey')") 

回報

expression(print('hey')) 

你也可以通過做

expression(print('hey')) 

識別表情稍微令人驚訝的這個輸出是

expression(print("hey")) 

注雙的變化引號。但這不是唯一的區別。通過parse(text = "print('hey')")getParseData具有與傳遞expression(print('hey'))不同的輸出。

getParseData(parse(text = "print('hey')")) 

line1 col1 line2 col2 id parent    token terminal text 
9  1 1  1 12 9  0     expr FALSE  
1  1 1  1 5 1  3 SYMBOL_FUNCTION_CALL  TRUE print 
3  1 1  1 5 3  9     expr FALSE  
2  1 6  1 6 2  9     '('  TRUE  (
4  1 7  1 11 4  6   STR_CONST  TRUE 'hey' 
6  1 7  1 11 6  9     expr FALSE  
5  1 12  1 12 5  9     ')'  TRUE ) 

getParseData(expression(print('hey'))) 

NULL 

我不確定這兩位輸出,我非常希望之間的差別就知道了。

另一個問題是(這可能會作爲一個單獨的問題,一旦這是回答問)parse甚至沒有一致的返回'可解析'輸出。當我在Rstudio的測試環境中測試使用parse的功能時,我首先意識到存在差異,該功能調用devtools::test。在那裏,parse(text = expression(print('hey')))返回了雙引號輸出expression(print("hey")),它在傳遞到getParseData時返回NULL

+0

那麼,問題就是爲什麼'表達(打印(「嗨」))'改變了引號雙引號?我並不感到驚訝,getParseData()不會返回未通過parse()運行的信息 - 它沒有任何行和列信息供其處理。也許你可以在這裏問一個明確的問題? – MrFlick

+0

確切的問題是輸出之間的差異。例如,您提到的行列信息。我怎樣才能從輸出中診斷它的缺席或在場(除了試圖解析它),從視覺上看,這兩個輸出看起來非常相似。 – OganM

+1

如果你有'a <-parse(text =「print('hey')」); b <-expression(print('hey'))'將它們的結構與'str(a); str(b);'你可以看到他們不一樣。 – MrFlick

回答

3

區別僅在於屬性。如果您從隨後將分析版本的屬性,他們是一致的:

p <- parse(text = "print('hey')") 
attributes(p) <- NULL 

e <- expression(print('hey')) 

identical(p, e) 
## [1] TRUE