R.NET是由大神jmp75所開發的, 有C#與F#的版本, 其開源網址如下
https://github.com/jmp75/rdotnet
藉由R.NET, 我們可以在C#的程式碼裡, 用組字串的方式, 組出R Script後, R.NET會把R叫起來執行, 並回傳執行結果, 所以接下來我們就用老兵不死, 只是凋零的ASP.NET Web Form來實作R.NET
接著我們在原來的方案, 新增一個ASP.NET Web專案如下
然後點選Empty專案類型, 與勾選Web Forms, 最後按下OK
接著我們透過NuGet來安裝R.NET
選擇R.NET Community, 按下Install
接著會跳出確認視窗, 按下OK
安裝完畢後, 可以在參考裡, 查看剛剛安裝的項目
在ASP.NET專案上按下右鍵, 點選Add, 加入一個New Item
點選Web Form會按下Add
在APSX的頁面, 輸入底下程式碼, 主要就是配置一個Button, 一個TextBox, 一個Lable與Image等四個控制項
在正式寫後台程式碼之前, 我們先將上一篇的dataset.rds與svr.rda檔案複製倒專案底下, 後續的步驟中會用到
再來點開ASPX的cs檔, 在Page_Load的事件裡撰寫程式邏輯, 第一個要實現的功能是當頁面載入時, 會顯示R的繪圖
接著在Page_Load輸入底下程式, 並且加入RDotNet的namespace
然後APS.NET的專案設為起始專案. 跑起來看看, 結果出現底下的錯誤
說是找不到e1071套件, 但是在前面幾篇已經安裝過了, 在到R 3.4.2的目錄查一下
明明有裝啊, 難不成見鬼了, 後來Google了一下, 大神jmp75有對這個問題做出解釋如下網址
http://jmp75.github.io/rdotnet/ts_asp_dot_net/
意思是要把R的目錄加入到環境變數裡, 找到環境變數如下紅框所示
找到Path後, 按下Edit
按下New, 輸入R路徑, 最後按下OK, 然後要重新開機才會生效, 這一步卡了半天
原本以為這樣就可以了, 沒想到出現大魔王, 設好Path後, e1071可以載入了, 但是ggplot2不能用, 這下真的GG了
又Google了半天, 貌似無解啊, 找到幾篇文章如下
https://github.com/jmp75/rdotnet/issues/59
https://stackoverflow.com/questions/26493117/c-sharp-and-r-net-not-displaying-any-graph-with-ggplot2
感覺是R.NET不支援R 3.4.2這個新版, 所以把心一橫, 切回MSSQL R Service 3.3.3版
重新設定Path如下
順便也要設定一下R_HOME, 讓R.NET跑MSSQL R Service 3.3.3版, 按下OK後, 記得重新開機
因為在Path設定的是跑R Service x64版本, 所以在Visual Studio自帶的IIS Express也修改成x64如下
接著就可以把網站跑起來, 成功如下
搞了一天, 總算弄出來了
接下來在設計模式, 點擊Predict Button兩次, 進入Button Click事件
然後在btnPredict_Click撰寫程式碼
有人應該會好奇程式碼簡潔許多? 不需要載入svr物件與e1071套件嗎? 答案是不用的, 原因是在Page Load的時候, R.NET已經起了R Session來繪圖, 只要不Dispose, R Session會一直留著, 即之前svr物件與e1071套件已經在Page Load載入, 就不需要再重新載入了, 成功執行如下
在Google大魔王攻略方法的同時, 發現一則使用R.NET的心得如下
http://frankzyj2010.blogspot.tw/2016/08/integrated-rnet-within-your-aspnet-mvc.html
該樓主結論是R.NET並不是萬能而有其限制與問題, 若跟Visual Studio整合開發的話, MSSQL R Service則是首選, 就自己實作的結果下來, R.NET來做模型預測, 這種比較簡單的工作, 應該還行, 但是訓練模型以及R Script太長的話, 除錯還真不好除錯, R Script的撰寫還是交給RTVS或是RStudio來做, 下一篇就來介紹ASP.NET與MSSQL R Service的互動
後記: 被R.NET燒腦了兩天, 時間越來越緊迫了