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


R source 從文件、連接或表達式中讀取 R 代碼


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

說明

source原因R直接接受來自指定文件、URL、連接或表達式的輸入。輸入被讀取並且parsed 從該文件直到到達文件末尾,然後在所選環境中按順序計算已解析的表達式。

withAutoprint(exprs)是一個包裝器source(exprs = exprs, ..)具有不同的默認值。它的主要目的是像在頂級上下文中一樣評估 auto-print 表達式,例如,如R安慰。

用法

source(file, local = FALSE, echo = verbose, print.eval = echo,
       exprs, spaced = use_file,
       verbose = getOption("verbose"),
       prompt.echo = getOption("prompt"),
       max.deparse.length = 150, width.cutoff = 60L,
       deparseCtrl = "showAttributes",
       chdir = FALSE,
       encoding = getOption("encoding"),
       continue.echo = getOption("continue"),
       skip.echo = 0, keep.source = getOption("keep.source"))

withAutoprint(exprs, evaluated = FALSE, local = parent.frame(),
              print. = TRUE, echo = TRUE, max.deparse.length = Inf,
              width.cutoff = max(20, getOption("width")),
              deparseCtrl = c("keepInteger", "showAttributes", "keepNA"),
              ...)

參數

file

connection 或給出要讀取的文件或 URL 的路徑名的字符串。 stdin() 連接在交互時從控製台讀取。

local

TRUEFALSE 或環境,確定解析表達式的計算位置。 FALSE(默認)對應於用戶的工作空間(全局環境),TRUE 對應於調用 source 的環境。

echo

邏輯性;如果 TRUE ,則在解析之後、求值之前打印每個表達式。

print.eval, print.

邏輯性;如果 TRUE ,則為每個表達式 i 打印 eval(i) 的結果;默認為 echo 的值。

exprs

對於 source()withAutoprint(*, evaluated=TRUE) :不指定 file ,而是指定 expressioncallcalllist ,但不是未計算的 “expression” 。

對於 withAutoprint() (默認為 evaluated=FALSE ):一個或多個未計算的 “expressions”。

evaluated

邏輯表明 exprs 被傳遞到 source(exprs= *) 因此必須進行評估,即正式的 expressioncalllist 調用。

spaced

邏輯指示是否應在每個表達式之前打印換行符(因此為空行)(當 echo = TRUE 時)。

verbose

如果 TRUE ,則在解析和評估輸入期間會打印更多診斷信息(不僅僅是 echo = TRUE ),包括每個表達式的額外信息。

prompt.echo

特點;如果 echo = TRUE 給出要使用的提示。

max.deparse.length

整數;僅當 echoTRUE 時使用,並給出單個表達式的解析輸出的最大字符數。

width.cutoff

整數,傳遞給deparse(),(僅)在沒有源引用時使用。

deparseCtrl

character向量,傳遞為controldeparse(), 也可以看看.deparseOpts。在R版本 <= 3.3.x,這被硬編碼為"showAttributes",目前默認;deparseCtrl = "all"當嚴格的向後兼容性並不重要時,可能更可取。

chdir

邏輯性;如果TRUEfile是一個路徑名,R工作目錄暫時更改為包含的目錄file用於評估。

encoding

字符向量。當 file 是字符串時假定的編碼:參見 file 。當猜測編碼時,可能的值為"unknown":請參閱“編碼”部分。

continue.echo

特點;如果 echo = TRUE 則給出在連續行上使用的提示。

skip.echo

整數;如果 echo = TRUE 則要跳過文件開頭的多少注釋行。

keep.source

邏輯:如果可能的話,在回顯表達式時是否應該保留源格式?

...

(對於 withAutoprint() :) 將進一步(非文件相關)參數傳遞給 source(.)

細節

請注意,通過運行代碼source與在R命令行。由於表達式不在頂層執行,因此 auto-printing 未完成。所以你需要包含明確的print調用您想要打印的內容(請記住,這包括通過lattice,常見問題解答 Q7.22)。由於在運行任何文件之前都會解析完整的文件,因此語法錯誤會導致任何代碼都不會運行。如果在運行語法正確的腳本時發生錯誤,則通過已運行的代碼分配到工作區的任何內容都將被保留(就像從命令行一樣),但診斷信息,例如traceback()將包含額外的調用withVisible.

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

如果 keep.source 為 true(交互式使用中的默認值),則保留函數源,以便可以將它們準確地列為輸入。

與控製台輸入不同,文件中或連接上的行可以包含無限數量的字符。

skip.echo > 0 時,文件開頭的許多注釋行將不會被回顯。這根本不影響代碼的執行。如果前skip.echo 行中有可執行行,則回顯將從第一行開始。

如果 echo 為 true 並且解析表達式超過 max.deparse.length ,則輸出那麽多字符,後跟 .... [TRUNCATED]

編碼

默認情況下,以當前編碼讀取並解析輸入R會議。這通常是所需要的,但有時需要重新編碼,例如如果要在 Windows 上讀取來自使用 UTF-8 的係統的文件(或反之亦然)。

如果 file 是實際文件名或 URL(而不是連接),則本段的其餘部分適用。如果 encoding = "unknown" ,則嘗試猜測編碼:localeToCharset() 的結果用作指導。如果encoding有兩個或多個元素,則依次嘗試它們,直到可以在嘗試編碼中無錯誤地讀取文件/URL。如果在 Latin-1 或 UTF-8 語言環境中指定了實際的 encoding (而不是默認值或 "unknown" ),則結果中的字符串將被轉換為當前編碼並進行標記(請參閱 Encoding )。

如果 file 是一個連接,則無法對 source 內的輸入重新編碼,因此 encoding 參數僅用於標記 Latin-1 和 UTF-8 語言環境中已解析輸入中的字符串:參見parse

例子

someCond <- 7 > 6
## want an if-clause to behave "as top level" wrt auto-printing :
## (all should look "as if on top level", e.g. non-assignments should print:)
if(someCond) withAutoprint({
   x <- 1:12
   x-1
   (y <- (x-5)^2)
   z <- y
   z - 10
})

## If you want to source() a bunch of files, something like
## the following may be useful:
 sourceDir <- function(path, trace = TRUE, ...) {
    op <- options(); on.exit(options(op)) # to reset after each 
    for (nm in list.files(path, pattern = "[.][RrSsQq]$")) {
       if(trace) cat(nm,":")
       source(file.path(path, nm), ...)
       if(trace) cat("\n")
       options(op)
    }
 }

suppressWarnings( rm(x,y) ) # remove 'x' or 'y' from global env
withAutoprint({ x <- 1:2; cat("x=",x,"\n"); y <- x^2 })
## x and y now exist:
stopifnot(identical(x, 1:2), identical(y, x^2))

withAutoprint({ formals(sourceDir); body(sourceDir) },
              max.deparse.length = 20, verbose = TRUE)

參考

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

也可以看看

demo 使用 sourceevalparsescanoptions("keep.source")

sys.source 這是將文件源到環境中的簡化版本。

“R 語言定義”,用於討論源指令。

相關用法


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