當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R parse 解析 R 表達式


R語言 parse 位於 base 包(package)。

說明

parse() 返回 expressioncall 的 “list” 中已解析但未計算的表達式。

str2expression(s)str2lang(s)返回parse(text=s, keep.source=FALSE)的特殊版本,因此可以被視為將字符串s轉換為表達式、調用等。

用法

parse(file = "", n = NULL, text = NULL, prompt = "?",
      keep.source = getOption("keep.source"), srcfile,
      encoding = "unknown")

str2lang(s)
str2expression(text)

參數

file

connection ,或給出要從中讀取表達式的文件名或 URL 的字符串。如果file"" 並且text 缺失或NULL,則從控製台獲取輸入。

n

整數(或強製為整數)。要解析的最大表達式數。如果nNULL 或負數或NA,則將完整解析輸入。

text

字符向量。要解析的文本。元素被視為文件的行。其他R如果可能的話,對象將被強製為字符。

prompt

從鍵盤解析時打印的提示。NULL意味著使用R的提示,getOption("prompt").

keep.source

邏輯值;如果TRUE,保留源參考信息。

srcfile

NULL 、字符向量或 srcfile 對象。請參閱“詳細信息”部分。

encoding

輸入字符串采用的編碼。如果值為 "latin1""UTF-8",則用於將字符串標記為已知的 Latin-1 或 UTF-8:它不用於重新編碼輸入。要執行後者,請將編碼指定為連接 con 的一部分或通過 options(encoding=) :請參閱 file 下的示例。在 MBCS 區域設置中運行時,參數 encoding = "latin1"encoding = "UTF-8" 將被忽略並出現警告。

s

長度為 1character 向量,即 “string”。

細節

parse(....)

如果 text 的長度大於零(強製後),則優先使用 file

所有版本的R接受來自連接的輸入,行尾標記為 LF(在 Unix 上使用)、CRLF(在 DOS/Windows 上使用)或 CR(在經典 Mac OS 上使用)。最後一行可能不完整,即缺少最終的 EOL 標記。

當從控製台獲取輸入時, n = NULL 相當於 n = 1 ,並且 n < 0 將讀取直到讀取到 EOF 字符。 (對於 Windows front-ends,EOF 字符為 Ctrl-Z。)從控製台讀取時,line-length 限製為 4095 字節(這可能會施加下限:請參閱“R 簡介”)。

srcfile 的默認設置如下。如果 keep.source 不是 TRUE ,則 srcfile 默認為字符串,可以是 "<text>" 或從 file 派生的字符串。當 keep.sourceTRUE 時,如果使用 text,則 srcfile 將被設置為包含文本的 srcfilecopy。如果 file 使用字符串,則將使用引用該文件的 srcfile 對象。

srcfile是字符串時,錯誤消息將包含名稱,但源參考信息不會添加到結果中。當srcfilesrcfile對象時,將保留源引用信息。

str2expression(s)

對於 character 向量 sstr2expression(s) 對應於 parse(text = s, keep.source=FALSE) ,其類型始終為 ( typeof ) 和 class expression

str2lang(s)

對於 character 字符串 sstr2lang(s) 對應於 parse(text = s, keep.source=FALSE)[[1]] (加上檢查 sparse(*) 結果的長度均為 1),通常是 call 但也可以是symbol 又名 nameNULL 或原子常量,例如 21LTRUE 。換句話說,str2lang(.) 的值是一個調用或其一部分,簡而言之“一個調用或更簡單”。

目前,str2lang()str2expression() 中不處理編碼。

parse()str2expression() 返回 "expression" 類型的對象,如果指定為非負整數,則 parse() 最多包含 n 元素。

str2lang(s)s 一個字符串,返回“a call 或更簡單”,請參閱“詳細信息:”部分。

srcfile 不是 NULL 時,"srcref" 屬性將附加到包含與每個元素對應的 srcref 記錄列表的結果,將附加 "srcfile" 屬性,其中包含 srcfile 的副本,並且將附加一個 "wholeSrcref" 屬性,其中包含與所有已解析文本相對應的 srcref 記錄。詳細的解析信息將存儲在 "srcfile" 屬性中,由 getParseData 檢索。

語法錯誤(包括不完整的表達式)將引發錯誤。

如果 encoding"latin1""UTF-8" ,或者 text 與 Latin-1 或 UTF-8 語言環境中已知編碼的每個元素一起提供,結果中的字符串將具有聲明的編碼。

部分解析

當解析期間發生語法錯誤時,parse 會發出錯誤信號。如果它是 srcfile 對象並且 text 參數用於提供文本,則部分解析數據將存儲在 srcfile 參數中。在其他情況下,當錯誤被觸發時它會丟失。

可以使用應用於 srcfile 對象的 getParseData 來檢索部分解析數據。由於解析不完整,因此通常會包含對不存在的 "parent" 條目的引用。

注意

使用 parse(text = *, ..) 或其簡化且更高效的版本 str2lang()str2expression() 的效率至少比 call(..)as.call() 低一個數量級。

例子

fil <- tempfile(fileext = ".Rdmped")
cat("x <- c(1, 4)\n  x ^ 3 -10 ; outer(1:7, 5:9)\n", file = fil)
# parse 3 statements from our temp file
parse(file = fil, n = 3)
unlink(fil)

## str2lang(<string>)  || str2expression(<character>) :
stopifnot(exprs = {
  identical( str2lang("x[3] <- 1+4"), quote(x[3] <- 1+4))
  identical( str2lang("log(y)"),      quote(log(y)) )
  identical( str2lang("abc"   ),      quote(abc) -> qa)
  is.symbol(qa) & !is.call(qa)           # a symbol/name, not a call
  identical( str2lang("1.375" ), 1.375)  # just a number, not a call
  identical( str2expression(c("# a comment", "", "42")), expression(42) )
})

# A partial parse with a syntax error
txt <- "
x <- 1
an error
"
sf <- srcfile("txt")
tryCatch(parse(text = txt, srcfile = sf), error = function(e) "Syntax error.")
getParseData(sf)

參考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

Murdoch, D. (2010). “Source References”. The R Journal, 2(2), 16-19. doi:10.32614/RJ-2010-010.

也可以看看

scansourceevaldeparse

源參考信息可用於調試(例如,參見setBreakpoint)和分析(參見Rprof)。可以通過getSrcref及相關函數進行檢查。更詳細的信息可通過 getParseData 獲得。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Parse R Expressions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。