iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
0
Data Technology

Microsoft R Solution系列 第 26

Day26 – R Last Mile to Web Part2 ASP.NET與R.NET

R.NET是由大神jmp75所開發的, 有C#與F#的版本, 其開源網址如下
https://github.com/jmp75/rdotnet
https://ithelp.ithome.com.tw/upload/images/20180113/20103333nVGoHXgebN.png

藉由R.NET, 我們可以在C#的程式碼裡, 用組字串的方式, 組出R Script後, R.NET會把R叫起來執行, 並回傳執行結果, 所以接下來我們就用老兵不死, 只是凋零的ASP.NET Web Form來實作R.NET

接著我們在原來的方案, 新增一個ASP.NET Web專案如下
https://ithelp.ithome.com.tw/upload/images/20180113/20103333K4KHs6EUOI.png

然後點選Empty專案類型, 與勾選Web Forms, 最後按下OK
https://ithelp.ithome.com.tw/upload/images/20180113/20103333glTC8R41lC.png

接著我們透過NuGet來安裝R.NET
https://ithelp.ithome.com.tw/upload/images/20180113/20103333hkEKIFf3LF.png

選擇R.NET Community, 按下Install
https://ithelp.ithome.com.tw/upload/images/20180113/20103333io6GX0B6ss.png

接著會跳出確認視窗, 按下OK
https://ithelp.ithome.com.tw/upload/images/20180113/20103333Y7LAphkrJV.png

安裝完畢後, 可以在參考裡, 查看剛剛安裝的項目
https://ithelp.ithome.com.tw/upload/images/20180113/201033337U8Sjn0aWG.png

在ASP.NET專案上按下右鍵, 點選Add, 加入一個New Item
https://ithelp.ithome.com.tw/upload/images/20180113/20103333InrsUNYx9v.png

點選Web Form會按下Add
https://ithelp.ithome.com.tw/upload/images/20180113/20103333nZUWqSU0BA.png

在APSX的頁面, 輸入底下程式碼, 主要就是配置一個Button, 一個TextBox, 一個Lable與Image等四個控制項
https://ithelp.ithome.com.tw/upload/images/20180113/20103333nbU10J6E5F.png

在正式寫後台程式碼之前, 我們先將上一篇的dataset.rds與svr.rda檔案複製倒專案底下, 後續的步驟中會用到
https://ithelp.ithome.com.tw/upload/images/20180113/20103333BvFeB5PPta.png

再來點開ASPX的cs檔, 在Page_Load的事件裡撰寫程式邏輯, 第一個要實現的功能是當頁面載入時, 會顯示R的繪圖
https://ithelp.ithome.com.tw/upload/images/20180113/20103333WUSIM5bQ0W.png

接著在Page_Load輸入底下程式, 並且加入RDotNet的namespace
https://ithelp.ithome.com.tw/upload/images/20180113/20103333xVw6AgB00W.pnghttps://ithelp.ithome.com.tw/upload/images/20180113/20103333VFsFIdOnq0.png

然後APS.NET的專案設為起始專案. 跑起來看看, 結果出現底下的錯誤
https://ithelp.ithome.com.tw/upload/images/20180113/201033337BbuAJha2J.png

說是找不到e1071套件, 但是在前面幾篇已經安裝過了, 在到R 3.4.2的目錄查一下
https://ithelp.ithome.com.tw/upload/images/20180113/20103333NOX7xxeW5j.png

明明有裝啊, 難不成見鬼了/images/emoticon/emoticon17.gif, 後來Google了一下, 大神jmp75有對這個問題做出解釋如下網址
http://jmp75.github.io/rdotnet/ts_asp_dot_net/
https://ithelp.ithome.com.tw/upload/images/20180113/20103333HZvjRhdAYv.png

意思是要把R的目錄加入到環境變數裡, 找到環境變數如下紅框所示
https://ithelp.ithome.com.tw/upload/images/20180113/20103333YfOxWPKrYO.png

找到Path後, 按下Edit
https://ithelp.ithome.com.tw/upload/images/20180113/20103333Uwilzt3ngy.png

按下New, 輸入R路徑, 最後按下OK, 然後要重新開機才會生效, 這一步卡了半天/images/emoticon/emoticon20.gif
https://ithelp.ithome.com.tw/upload/images/20180113/20103333nZWMyoWJ3R.png

原本以為這樣就可以了, 沒想到出現大魔王, 設好Path後, e1071可以載入了, 但是ggplot2不能用, 這下真的GG了/images/emoticon/emoticon46.gif
https://ithelp.ithome.com.tw/upload/images/20180113/20103333UPCNuQu14A.png

又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如下
https://ithelp.ithome.com.tw/upload/images/20180113/20103333NaFSXYIwEC.png

順便也要設定一下R_HOME, 讓R.NET跑MSSQL R Service 3.3.3版, 按下OK後, 記得重新開機
https://ithelp.ithome.com.tw/upload/images/20180113/20103333xq5BfHDV88.png

因為在Path設定的是跑R Service x64版本, 所以在Visual Studio自帶的IIS Express也修改成x64如下
https://ithelp.ithome.com.tw/upload/images/20180113/201033339a4RPs3SAO.png

接著就可以把網站跑起來, 成功如下
https://ithelp.ithome.com.tw/upload/images/20180113/20103333gPbbNtHhfO.png

搞了一天, 總算弄出來了/images/emoticon/emoticon34.gif

接下來在設計模式, 點擊Predict Button兩次, 進入Button Click事件
https://ithelp.ithome.com.tw/upload/images/20180113/20103333lCTvjA4TWg.png

然後在btnPredict_Click撰寫程式碼
https://ithelp.ithome.com.tw/upload/images/20180113/20103333lZBcQEDeYf.png

有人應該會好奇程式碼簡潔許多? 不需要載入svr物件與e1071套件嗎? 答案是不用的, 原因是在Page Load的時候, R.NET已經起了R Session來繪圖, 只要不Dispose, R Session會一直留著, 即之前svr物件與e1071套件已經在Page Load載入, 就不需要再重新載入了, 成功執行如下
https://ithelp.ithome.com.tw/upload/images/20180113/201033334stn773WVU.png

在Google大魔王攻略方法的同時, 發現一則使用R.NET的心得如下
https://ithelp.ithome.com.tw/upload/images/20180113/20103333XuDLChV3Sg.png
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燒腦了兩天, 時間越來越緊迫了/images/emoticon/emoticon02.gif


上一篇
Day25 – R Last Mile to Web Part1 Shiny
下一篇
Day27 – R Last Mile to Web Part3 ASP.NET與 MSSQL R Service
系列文
Microsoft R Solution30

尚未有邦友留言

立即登入留言