執行 R 指令碼
重要
Machine Learning 工作室 (傳統) 的支援將於 2024 年 8 月 31 日結束。 建議您在該日期之前轉換成 Azure Machine Learning。
自 2021 年 12 月 1 日起,您將無法建立新的 Machine Learning 工作室 (傳統) 資源。 在 2024 年 8 月 31 日之前,您可以繼續使用現有的 Machine Learning 工作室 (傳統) 資源。
ML 工作室 (傳統) 文件即將淘汰,未來將不再更新。
從 機器學習 Studio (傳統) 實驗執行 R 腳本
類別: R 語言模組
模組概觀
本文說明如何在 機器學習 Studio (傳統) 中使用執行 R 腳本模組,在實驗中呼叫和執行 R 程式碼。
藉由將 R 程式碼新增至本課程模組,您可以執行 Studio (傳統) 中無法使用的各種自訂工作。 例如:
- 建立自訂資料轉換
- 使用您自己的計量來評估預測
- 使用未在 Studio 中實作為獨立模組的演算法建置模型, (傳統)
Studio (傳統) 支援的 R 版本
Studio (傳統) 支援 CRAN 提供的一般 R 散發,以及 Microsoft R Open (MRO) ,其中包含所有基底 R 套件,以及 Revo 套件。
您可以指定要在實驗中使用的 R 版本。 不過,您無法將任何其他版本的 R 安裝到您的工作區。
建議您先判斷需要哪些套件,再選擇 R 散發套件。某些套件與 CRAN R 和 Microsoft R Open 不相容。
注意
目前, 建立 R 模型 模組僅限於特定的 R 版本。因此,如果您在實驗中使用自訂 R 模型,則相同實驗中的任何 執行 R 腳本 模組也必須使用相同的 R 版本。 在下列文章中尋找支援的 R 版本:機器學習 Studio 支援的 R 套件, (傳統) 。
受支援的 R 套件
機器學習中的 R 環境已安裝超過 500 個 R 套件。 當然,並非所有預設都會載入,但您可以輕鬆地將它們載入為 R 程式碼的一部分。
若要取得所有目前套件的清單,請將下列程式碼新增至 執行 R 腳本 模組並執行模組。
data.set <- data.frame(installed.packages())
maml.mapOutputPort("data.set")
本主題列出 機器學習 支援的套件,以及其與 CRAN R 和 Microsoft R Open 的相容性,請參閱機器學習 Studio 支援的 R 套件 (傳統) 。
安裝新的 R 套件
您可以使用 執行 R 腳本 模組,在工作區中安裝新的 R 套件。 套件必須以壓縮格式上傳。 當您的實驗載入 Azure 執行時間環境時,套件會解除封裝,並新增至實驗工作區中的 R 環境。 如需詳細資訊,請參閱 如何安裝新的 R 套件
當實驗未執行時,尚未解壓縮的套件 不會 保存在工作區中。 基於這個理由,您打算使用的任何其他 R 套件都必須以壓縮格式在工作區或 Azure 儲存體中使用。
無法跨 執行 R 腳本 模組的不同實例共用套件,因為每個模組可能會在執行時間載入不同的容器中。 不過,您可以將 R 物件公開為資料集,以在模組之間共用 R 物件。 如需詳細資訊,請參閱 在模組之間傳遞 R 物件。
實驗範例
Azure AI 資源庫中有許多自訂 R 腳本範例:
學生效能:使用自訂 R 腳本將多個模型的評估結果結合成單一資料集。 此範例也會在 [執行 R 指令碼] 模組中使用 R 程式碼來計算 16 個時間相依資料行。
疾病:使用 執行 R 腳本 模組中的自訂程式碼來複寫正面範例,並結合計量。
如何設定執行 R 指令碼
若要設定 [執行 R 指令碼] 模組,您要提供一組選擇性輸入,以及要在工作區中執行的 R 程式碼。
如果您將其準備在壓縮封存檔案中準備以附加至 腳本套件組合 輸入,您也可以新增包含其他 R 程式碼的檔案。
若要安裝任何其他套件,請將它們包含在壓縮封存檔案中。
將 執行 R 腳本 模組新增至實驗。 您可以在 R語言模組群組的 機器學習 Studio (傳統) 中找到此課程模組。
連線腳本所需的任何輸入。 輸入可以包含資料、您以壓縮檔案格式新增至工作區的資料、R 套件,以及其他 R 程式碼。
資料集1:第一個輸入是您附加主要資料集的位置, (選擇性) 。 輸入資料集必須格式化為 CSV、TSV 或 ARFF 檔案,或者您可以連線機器學習資料集。
Dataset2:第二個輸入 (選擇性) 支援新增第二個資料集。 此資料集也必須格式化為 CSV、TSV 或 ARFF 檔案,或者您可以連線機器學習資料集。
腳本套件組合:第三個輸入是選擇性的,採用.ZIP格式的檔案。 壓縮的檔案可以包含多個檔案和多個檔案類型。 例如,壓縮封存可能包含腳本檔案中的 R 程式碼、用於腳本的 R 物件、本身隨附于.ZIP格式的 R 套件,或其中一種支援格式的資料集。
在 [ R 腳本] 文字方塊中輸入 R 腳本。 這是使用輸入節點上資料集的最簡單方式。
為了協助您開始使用, R 腳本 文字方塊會預先填入下列範例程式碼,您可以編輯或取代。
# Map 1-based optional input ports to variables dataset1 <- maml.mapInputPort(1) # class: data.frame dataset2 <- maml.mapInputPort(2) # class: data.frame # Contents of optional Zip port are in ./src/ # source("src/yourfile.R"); # load("src/yourData.rdata"); # Sample operation colnames(dataset2) <- c(dataset1['nombre_columna'])$nombre_columna; data.set = dataset2; # You'll see this output in the R Device port. # It'll have your stdout, stderr and PNG graphics device(s). # Select data.frame to be sent to the output Dataset port maml.mapOutputPort("data.set");
如需如何使用輸入和寫入輸出的詳細資訊,請參閱本主題中的 R 程式碼範例 。
注意
在外部工具中正常執行的 R 程式碼可能需要小型變更,才能在 Azure ML實驗中執行。 例如,您以 CSV 格式提供的輸入資料應該明確轉換成資料集,才能在程式碼中使用。 R 語言中使用的資料和資料行類型也與機器學習中使用的資料和資料行類型不同。 如需詳細資訊,請參閱技術提示一節。
執行 R 腳本模組是在 R環境的沙箱中執行,不建議在此課程模組中設定 HTTP/SQL連線。隨機種子:輸入 R 環境內要使用的值做為隨機種子值。 此參數等同於呼叫 R 程式碼中的
set.seed(value)
。R 版本:選取工作區中要載入的 R 版本。
CRAN R 3.1.0:完整 R 封存網路網站是 開放原始碼 R 語言的存放庫。 如需詳細資訊,請參閱 CRAN 網站。
Microsoft R Open 3.2.2:MRO 是 Microsoft Corporation 的 R 增強散發。 它是以開放原始碼 R 引擎為基礎的開放原始碼平臺,且與使用相同 R 版本的所有 R 套件、腳本和應用程式完全相容。不過,MRO 相較于標準 R 散發提供改善的效能,因為其使用高效能的多執行緒數學程式庫。 如需詳細資訊,請參閱 Microsoft R Open。
您無法將任何其他版本的 R 安裝到工作區中。
機器學習支援多個 R 版本,但在任何實驗中只能使用一個版本。
執行實驗,或選取 [執行 R 腳本] 模組,然後按一下 [ 執行選取的執行]。
結果
模組可以傳回多個輸出。
- 若要讓資料集返回,您的 R 程式碼應該會傳回單一 R data.frame。
- 您可以在 R 圖形裝置中顯示影像,該裝置會顯示在 機器學習 Studio (傳統) 記錄區域中。
- 若要保存影像,您可以將影像寫入檔案,或將它們序列化為表格式格式。
- 您可以將物件儲存到工作區。
- R 的標準訊息和錯誤會傳回模組的記錄檔。
(1 個) 結果資料集
此輸出包含模組中 R 程式碼所產生的資料框架。
您只能輸出一個資料框架。 其他表格式物件必須使用 R 函式轉換成資料框架。 模組 R 程式碼的資料框架輸出會自動轉換成內部 資料表 格式。
若要確認傳回的物件與 Studio (傳統) 相容,請使用
is.data.frame
必須傳回 True。若要傳回其他 R 物件,請嘗試將物件序列化為位元組陣列,或使用函數,將所需的資料以
data.frame
傳回。
(2) R 裝置
R 裝置支援主控台輸出 (標準輸出和標準錯誤,) 並使用 R 解譯器顯示 PNG 圖形。
若要檢視傳送至 R 主控台的訊息 (標準輸出和標準錯誤) ,請在模組執行完成之後,以滑鼠右鍵按一下模組,選取 [R 裝置],然後選取 [ 視覺化]。
若要檢視 R 裝置埠上產生的圖形,請在模組執行完成之後,以滑鼠右鍵按一下模組,選取 [R 裝置],然後選取 [ 視覺化]。
例如,下圖只由幾行 R 程式碼產生。
您可以在 Azure AI 資源庫中找到此和相關範例。
- 若要儲存 執行 R 腳本 模組所產生的映射,請以滑鼠右鍵按一下映射並儲存本機複本。 或者,您可以使用呼叫其中一個 R 圖形裝置函式,將映射檔寫入與實驗相關聯的 Azure Blob 儲存體帳戶,如 本範例所述。
R 腳本和 R 秘訣範例
您可以使用自訂 R 指令碼來擴充實驗,方法有很多種。 本節提供一些常見工作的範例程式碼。
新增 R 腳本作為輸入
執行 R 腳本模組支援使用任意 R 腳本檔案做為輸入,前提是它們已事先備妥,並上傳至您的工作區作為 ZIP 檔案的一部分。
若要將包含 R 程式碼的 ZIP 檔案上傳至您的工作區,請按一下 [ 新增],按一下 [ 資料集],然後選取 [從本機檔案 ] 和 [ Zip 檔案 ] 選項。
將壓縮套件上傳至 Studio (傳統) 之後,請確認已儲存的 資料集 清單中是否有壓縮的檔案,然後將資料集連線到 腳本套件組合 輸入埠。
如果您的壓縮檔包含任何尚未安裝在 機器學習 Studio 中的 R 套件, (傳統) ,您必須在執行 R 腳本模組中將 R 套件安裝為自訂程式碼的一部分。 在實驗執行時間期間,所有包含在 ZIP 檔案中的檔案都可供使用。
如果指令碼套件組合檔案包含目錄結構,則會保留結構。 不過,您必須改變程式碼,將目錄 src 前面加上路徑。
產生影像、模型和其他物件
如果您需要產生影像或任何其他任意 R 物件,您可以將它序列化為位元組陣列,然後作為 data.frame,如下列範例所示:
as.data.frame(as.integer(serialize(g,con=NULL)));
Graph連結 https://igraph.org/r/ 庫的資料框架不支援序列化為數據框架。 請改用封裝中的 igraph
函 get.data.frame
式,將邊緣和頂點資訊放入資料框架中。
vertices <- get.data.frame(g, what="vertices")
然後,您可以將繪圖物件傳回為 data.frame,您可以從 執行 R 腳本 模組取得。
edges <- get.data.frame(g, what="edges")
從輸入讀取和寫入輸出
下列範例示範如何使用輸入和輸出埠。 它會以資料表的形式讀取輸入資料,並將資料表的複本附加至本身,有效地將資料表的大小加倍。 然後結果會傳送至輸出連接埠。
# Map existing dataset to first input port
dataset1 <- maml.mapInputPort(1) # class: data.frame
# Concatenate dataset1 to dataset 1
newdataset = rbind(dataset1, dataset1)
# Send the combined dataset to the output port
maml.mapOutputPort("newdataset");
讀取 ZIP 檔案作為輸入
此範例示範如何將資料集新增至機器學習 Studio (壓縮格式的傳統) ,然後使用資料作為執行 R 腳本模組的輸入。
- 以 CSV 格式建立資料檔案,並將其命名為 「mydatafile.csv」。
- 建立.ZIP檔案,並將 CSV 檔案新增至封存。
- Upload壓縮的檔案到您的機器學習工作區,如下所示:解壓縮壓縮的資料集。
- 連線產生的資料集至執行 R 腳本模組的ScriptBundle輸入。 換句話說,還不要將它解壓縮!
- 使用下列程式碼,從壓縮的檔案讀取 CSV 資料。 視需要指定資料檔案中使用的編碼方式,以避免稍後發生錯誤。
mydataset=read.csv("src/newdata.csv",encoding="UTF-8");
nrow(mydataset);
ncol(mydataset);
# Map new dataset to the first output port
maml.mapOutputPort("mydataset");
注意
傳遞至 執行 R 腳本 模組的所有資料都會轉換成 data.frame
與 R 程式碼搭配使用的格式。 這適用于與 DataTable format
機器學習所使用的 相容資料,包括 CSV 檔案、ARFF 檔案等等。
複寫資料列
此範例示範如何以 20 倍的因數複寫資料集中的正樣本,以平衡樣本。
dataset <- maml.mapInputPort(1)
data.set <- dataset[dataset[,1]==-1,]
pos <- dataset[dataset[,1]==1,]
for (i in 1:20) data.set <- rbind(data.set,pos)
row.names(data.set) <- NULL
maml.mapOutputPort("data.set")
根據 Arules 套件呼叫自訂學習模組
您可以將新的 R 套件上傳為.ZIP檔案,以將新 R 套件上傳至機器學習工作區,如這裡所述。 下列程式碼示範如何使用上傳的套件。
arules
假設 和arulesViz
套件已新增至工作區。連線上傳.ZIP檔案至執行 R 腳本模組的第三個輸入埠。
在 [R 腳本]文字方塊中,使用下列命令來呼叫 R 語言套件
Arules
所提供的先前關聯規則演算法,並在購物籃分析工作中套用學習模組。
library("arules")
library("arulesViz")
dataset <- read.transactions(file="src/SalesReport.csv", rm.duplicates= TRUE, format="single",sep=",",cols =c(1,2))
#dataset <- sapply(dataset,as.factor)
basket <- apriori(dataset,parameter = list(sup = 0.5, conf = 0.9,target="rules"));
inspect(basket)
# if this is not NULL i.e. if there are rules
plot(basket)
呼叫自訂貝氏機率學習模組
此範例示範如何呼叫不包含在 Studio (傳統) 的 R 程式庫。
Upload壓縮檔案,其中包含您工作區的連結
e1071
庫。連線上傳.ZIP檔案至執行 R 腳本模組的第三個輸入埠。
在 [ R 腳本] 文字方塊中,使用下列程式碼來實作貝氏機率學習模組。
library(e1071) features <- get.feature.columns(dataset) labels <- get.label.column(dataset) train.data <- data.frame(features, labels) feature.names <- get.feature.column.names(dataset) names(train.data) <- c(feature.names, "Class") model <- naiveBayes(Class ~ ., train.data)
呼叫自訂貝氏機率計分器
如果您有程式庫所 e1071
建立的現有模型,您可以呼叫程式庫所提供的 e1071
自訂計分器。
不過,若要在 執行 R 腳本 模組的個別實例中執行評分,您也必須提供包含 e1071
程式庫的壓縮檔做為評分模組的輸入,以及載入程式庫。 這是因為每個模組都會在容器中獨立執行。
library(e1071)
features <- get.feature.columns(dataset)
scores <- predict(model, features)
單一實驗中包含的所有 R 模組都必須使用相同的 R 執行時間版本。 您無法混用 R 版本,例如在一個模組中使用 CRANR,而另一個模組則使用 Microsoft R Open。
寫入圖形檔案
雖然 Studio (傳統) 支援使用R 裝置輸出埠顯示 PNG 檔案,但您可能會想要在 blob 中產生 PDF 檔案,Azure 儲存體用於報告。
此範例示範如何使用 執行 R 腳本 來產生圖表做為 PDF 檔案。
將 執行 R 腳本 新增至實驗。
在 R 腳本中建立基本 PDF 檔案,並從 執行 R 腳本 模組傳回 PDF 檔案的 Base64 編碼字串。
d <- maml.mapInputPort(1) d$dteday <- as.numeric(d$dteday) pdf() plot(d) dev.off() library(caTools) b64ePDF <- function(filename) { maxFileSizeInBytes <- 5 * 1024 * 1024 # 5 MB return(base64encode(readBin(filename, "raw", n = maxFileSizeInBytes))) } d2 <- data.frame(pdf = b64ePDF("Rplots.pdf")) maml.mapOutputPort("d2");
將此輸出傳遞至 匯出資料 模組,並將二進位值儲存至 Azure Blob 儲存體。
在執行 R 腳本模組之間傳遞 R 物件
您可以使用內部序列化機制,在 [執行 R 指令碼] 模組的執行個體之間傳遞 R 物件。 此範例假設您想要在兩個執行 R 腳本模組之間移動名為 的 A
R 物件。
將第一個 執行 R 腳本 模組新增至實驗,然後在 [ R 腳本 ] 文字方塊中輸入下列程式碼,以在模組的輸出資料表中建立序列化物件
A
作為資料行:serialized <- as.integer(serialize(A,NULL)) data.set <- data.frame(serialized,stringsAsFactors=FALSE) maml.mapOutputPort("data.set")
需要對整數類型的明確轉換,因為序列化函式會以 R
Raw
格式輸出資料,機器學習不支援此格式。新增 執行 R 腳本 模組的第二個實例,並將其連線至上一個模組的輸出埠。
在 [R 腳本] 文字方塊中輸入下列程式碼,以從輸入資料表中擷取物件
A
。dataset <- maml.mapInputPort(1) A <- unserialize(as.raw(dataset$serialized))
安裝新的 R 套件
您可以在 機器學習 中新增預設未安裝的 R 套件。 新增套件需要下列步驟:
- 以壓縮格式取得套件的Windows二進位檔。
- 將所需的套件和任何相依性壓縮成具有 .ZIP 副檔名的新單一壓縮封存檔案。
- Upload壓縮檔案作為您工作區的資料集。
- 連線新的資料集至執行 R 腳本模組。
- 在模組中使用 R 腳本安裝套件。
下列程式會將新的套件與其相依性一起新增。
下載您要匯入至機器學習之套件的壓縮檔案。 請務必取得壓縮檔案Windows版本。
注意
如果您已經擷取您想要在工作區中使用的 R 套件,您必須重新壓縮套件,或在您可以將 R 套件上傳至 Studio 時提供原始 ZIP 檔案, (傳統) 。
檢查是否有任何相依性,以及套件是否需要其他尚未在 Azure ML Studio 中的套件 (傳統) ,請以壓縮格式下載這些相依性,並將其新增至封存檔案。
以滑鼠右鍵按一下您要上傳之套件的壓縮檔案及其相依性,按一下 [ 傳送至],然後選取 [ 壓縮 (壓縮) 資料夾]。
提示
壓縮的資料夾應該至少包含一個具有目標套件的壓縮檔案,以及包含必要套件的其他 zip 檔案。
Upload包含所有套件的單一 ZIP 檔案 (,以及任何選擇性 R 程式碼檔案或資料檔案,) 至 Studio (傳統) 工作區。
您可以像上傳資料集一樣執行此動作:按一下 [ 新增]、按一下 [ 資料集],然後選取 [ 從本機檔案 ] 和 [Zip 檔案 ] 選項。
開啟 [ 已儲存的資料集] 清單,按一下 [ 我的資料集],然後確認壓縮的檔案可供使用。
將它拖曳到實驗中,以滑鼠右鍵按一下資料集,然後選取 [ 視覺化 ] 以檢視壓縮資料夾中所包含的檔案。 您在 [內容 ] 清單中看到的檔案名是您安裝套件時必須參考的名稱。
例如,假設您已上傳名為 的檔案,其中包含三個名為
NewRPackage.zip
、002.zip
和003.zip
的001.zip
R 套件。 在 [資料集]清單中,資料集的名稱會是 ,內容001.zip
為NewRPackage.zip
、002.zip
和003.zip
。連線資料集 (
NewRPackage.zip
) 至腳本套件組合輸入埠。此時,外部壓縮資料夾會擷取至工作區沙箱,路徑
src
中。 您現在可以使用下列套件:src\001.zip
src\002.zip
src\003.zip
若要安裝 R 套件,您可以從其 zip 檔案擷取每個套件,然後載入自主程式庫。
例如,假設檔案
src\001.zip
包含自訂 R 套件code001
,您會執行下列腳本:# install R package contained in src\001.zip install.packages("src/001.zip", lib = ".", repos = NULL, verbose = TRUE) library(code001, lib.loc=".", verbose=TRUE)
針對任何必要的套件重複安裝程式。
# install R package contained in src\002.zip install.packages("src/002.zip", lib = ".", repos = NULL, verbose = TRUE) library(code002, lib.loc=".", verbose=TRUE) # install R package contained in src\003.zip install.packages("src/003.zip", lib = ".", repos = NULL, verbose = TRUE) library(code003, lib.loc=".", verbose=TRUE)
注意
如果已安裝多個套件之間有任何相依性,請務必先安裝必要的套件,否則您可能會收到錯誤。
所有 R 套件的安裝都必須執行為實驗的一部分,以確保在執行實驗時,所有必要套件都包含在傳送至 Azure 作業佇列的工作區中。
在實驗執行或關閉會話之後,工作區中的套件不會保存。 不過,當您重新執行實驗時,可以快速擷取您上傳為壓縮檔案的任何套件並加以使用。
技術說明
優化 Studio 中的 R 效能 (傳統)
目前的預設記憶體為 14 GB。 如果您嘗試使用 [執行 R 指令碼] 模組來操作非常大型的資料框架,可能會遇到記憶體不足的錯誤訊息。
若要增加 R 指令碼所使用的記憶體數量,您可以在指令碼開頭使用類似下列字行:
memory.limit(56000)
使用者指定的 R 程式碼是由使用 A8 虛擬機器與 56 GB RAM 在 Azure 中執行的 64 位 R 解譯器執行。 若要提高 R 程式碼的速度,您可以使用預先安裝編譯器套件中提供的 Just-In-Time 編譯 程式。
在 R 和 Studio 之間轉換資料類型 (傳統)
下表顯示 R 中的資料類型如何對應至 機器學習 中的資料類型:
R 類型 | Studio (傳統) 類型 |
---|---|
整數 | 整數 |
Double | Double |
Complex | Complex 只有部分模組可支援此類型。 |
邏輯 | Boolean |
字元 | String |
Raw | 不支援 |
Difftime | TimeSpan |
factor | 類別 |
data.frame | 資料集 |
無法轉換 R 中資料類型為 lists
的資料行,因為這類資料行中的項目可能屬於不同的類型和大小。 例如,如果在 執行 R 腳本 模組中使用下列有效的 R 程式碼會失敗:
data.set <- data.frame(r=I(list(list(1,2,3),list(4,5))))
maml.mapOutputPort("data.set")
轉換 datetime 值
機器學習 Studio (傳統) 使用與 R 不同的日期時間類型。如果您要分析的資料包含日期或時間資料,則當您將現有的 R 程式碼移植到 Studio (傳統) 時,您應該注意下列轉換需求:
從 機器學習 Studio (傳統) 轉換為 R
DateTime 資料行會轉換成 POSIXct 向量。 不過,產生的向量的每個個別元素都是自 1970-01-01T00:00:00 起的秒數。
這種轉換不會調整時區。
從 R 轉換為 Studio (傳統)
POSIXct 向量會轉換成 UTC 時區的 DateTime 資料行。
例如,2011-03-27 01:30:00 PDT 會轉換成 2011-03-27T08:30:00Z,其中 Z 表示該時間是在 UTC。
提示
在 [執行 R 指令碼] 模組中使用時間時,您必須明確地指定時間戳記。 裝載在 [執行 R 指令碼] 模組中的 R 解譯器沒有當地時區定義的存取權。
網路
基於安全考量,Azure 會封鎖 [執行 R 指令碼] 模組中與 R 程式碼往來的所有網路作業。 此外,有極少數的例外狀況,也會封鎖從 [執行 R 指令碼] 存取本機連接埠。
平行執行
目前不支援多個執行緒的平行執行。
預期的輸入
名稱 | 類型 | 描述 |
---|---|---|
Dataset1 | 資料表 | 輸入資料集 1 |
Dataset2 | 資料表 | 輸入資料集 2 |
腳本套件組合 | Zip | 一組 R 來源 |
模組參數
名稱 | 範圍 | 類型 | 預設 | 描述 |
---|---|---|---|---|
R Script | 任意 | StreamReader | 指定指向 R 指令碼來源的 StreamReader 。 |
|
隨機種子 | >=0 | 整數 | 定義 R 環境內使用的隨機種子值。 相當於 \"set.seed(value)\" 。這是選擇性參數。 |
輸出
名稱 | 類型 | 描述 |
---|---|---|
結果集 | 資料表 | 輸出資料集 |
R 裝置 | 資料表 | 來自 R 解譯器的主控台輸出和 PNG 圖形裝置 |