RCaller教程:在FME中R的輸入和輸出
介紹
如果你需要執行比StatisticsCalculator更高級的統計功能,則可以使用轉換器Rcaller實現更高級的統計分析。Rcaller讓你能夠在FME中執行R script。
下載
5914-rcallerlinearregression.fmwt
5910-rcallerlinearregressionwithgroups.fmwt
入門
在使用RCaller之前,你需要安裝合適的R軟件包。請參閱FME用戶文檔中有關安裝R解釋器的章節。
在開始使用RCaller之前,記住兩件事:
- R不喜歡UNC路徑名,因此,不能運行存儲在UNC路徑上的FME工作空間。即:\\myprojects\fmeWorkspaces.你必須在映射的驅動器上運行FME工作空間,即:f:\myprojects\fmeWorkspaces.
- 如果你不熟悉這些概念,請閱讀R的一些內容。這裏提供一個教程。
源數據
將轉換器或要素類連接到RCaller的輸入端口時,FME會向RCaller添加新的端口。這個新的輸入端口會繼承源對象的名稱(即變量名或要素類名)。
端口名稱用作R中的data frame的名稱,因此可以將端口名稱命名爲你可以在R腳本中使用的名稱。
FME將數據加載到臨時的SQLite數據庫,因此,爲了提高性能和可讀性,只需選擇要在R腳本中使用的屬性。確保數據類型正確。
FME將放入R的數據看作data frame。可以通過拖動“Data Frames”裏列出的data frame來訪問數據:
比如,要訪問向量Estimated,只需要將Estimated拖動到腳本窗口中,你就會看到Date$Estimated.
創建R腳本
這不是R教程。如果你是R新手,我建議你使用R Console來開發和調試R腳本——你可以更容易的看到中間結果,也能得到更好的反饋。然後將腳本複製粘貼到RCaller中。在R Console中可以清楚發現問題所在,同時,可以使用R提供的模塊加載數據樣本。即:
注意:R使用UNIX路徑,即’/’而不是’\’。
輸出R結果
可能會很棘手!RCaller通過一個名爲“fmeOutput”的data frame將數據傳回給FME,data frame的每一行都將成爲FME中的一個單獨的要素輸出。如果你知道如何構建和添加data frame,你可以跳過本章節。
要填充fmeOutput的data frame,你可以簡單地傳回一列值(向量長度爲1)。即:
這會產生一個FME要素,該要素包含兩個平均值,其屬性名爲meanX和meanY。但是,大部分情況下,R函數返回的結果更復雜些。比如,解決y=mx+k這種問題的線性迴歸函數:
使用R函數summary()查看結果:
如何讓結果返回FME?
函數names()會返回summary裏面的變量名:
但是,其中的一些屬性本身就是更復雜的對象,比如coefficients:
如何將結果返回給FME,比如y=mx+k分析結果裏的r方,m和k?
你必須將你需要的值挑選出來並傳遞給fmeOutput. 在上面的例子中,m由Data$Estimate的Estimate = -0.009291111給出,k(y截距)由(Intercept)的Estimate = 12.051001492給出,r方直接由r.squared給出。所以,可以如此設置:
非常簡單!
工作空間5976-rcallerlinearregression.fmwt說明了上述示例。
最後一個提示:在RCaller中暴露結果變量,使工作空間的工作更輕鬆:
R結果導出到臨時文件
在某些情況下,可能不適合爲R結果使用data frame。比如對於大型柵格或影像數據。在這種情況下,你可以將你的R結果導出到臨時數據文件,並讓FME重新讀取這些結果。
循環分組
對於某個統計問題,比如你有一個定性屬性Code,其值爲ABC ABD和TXU。它與定量值有一定的關係,這樣分組就變得有意義。
例如,你可能需要計算每個Code的平均值:
你可以將分析放入循環中,通過Code對數據進行採樣,然後計算迴歸。過程如下:
但是你不能只使用
r2 <- summary(lm)$r.squared
返回結果,因爲這樣你只是返回了最近的r2,而不是計算出來的三個值。
一個可行的解決方法是,爲每個結果構建向量,然後將這些結果向量複製給fmeOutput。
你還可以將結果直接分配給一個效率更高的data frame。
工作空間5910-rcallerlinearregressionwithgroups.fmwt演示了上述示例。
調試R腳本
如果你對R比較陌生,那麼我建議你現在R Console中開發腳本,然後再轉移到RCaller。如果你遇到RCaller錯誤:
ERROR |RCaller(InlineQueryFactory): InlineQueryFactory failed with exit code 1 when executing R script. Output was: Loading required package: gsubfn Loading required package: proto Loading required package: RSQLite
如果腳本中存在語法錯誤或未定義的變量引用,這似乎是常見的錯誤響應,因此請仔細檢查腳本中未分配的變量或拼寫錯誤。
記住,和FME一樣,R是區分大小寫的。