PHP 執行外部 R 指令稿
建立一個 PHP 指令稿,將其命名為 r.php,內容如下:
https://blog.gtwang.org/r/integrating-php-and-r/
(第一張圖)
上面這段程式碼的上半部是一個普通的 HTML form,可以用來送出使用者所輸入的參數,而下半部則是 PHP 的程式碼,在接收使用者輸入的 n 值之後,透過 PHP 的exec 執行外部程式,而 Rscript 這個程式則是附屬在 R 中的一個程式,只要安裝好 R 之後系統上就會有這個程式,它是專門用來執行 R 指令稿的工具程式。
最後在執行完 R 指令稿之後,要顯示繪圖的結果,由於我們每一次所繪製的圖檔檔名都一樣,所以需要在圖檔後方加上一串亂數,強迫讓瀏覽器重新抓取新的圖檔(也就是不要使用瀏覽器的快取),這樣每次送出新的 n 值才會顯示新的結果。
以下是 script.R 這一個 R 指令稿的內容:
https://blog.gtwang.org/r/integrating-php-and-r/
(第二張圖)
在 R 中我們透過 commandArgs 取得從 shell 中傳入的參數,其中第一個參數就是使用者輸入的 n 值,藉由這樣的方式就可以取得從 PHP 傳過來的資料。接著產生一些常態分佈的亂數資料,並繪製一張直方圖,我們將圖形儲存至 output 這個目錄中,然後再讓網頁直接讀取這個圖檔,這樣就可以將結果傳給使用者。
這裡我是規劃 output 目錄專門用來放置輸出的圖檔,由於 R 的指令稿會以執行網頁伺服器的使用者(在 Ubuntu Linux 中通常是 www-data)權限來執行,所以請注意目錄權限的設定,要讓伺服器有權限可以寫入這個目錄。
PHP 開啟管線執行 R 指令稿
以 PHP 的 exec 執行外部的 R 指令稿是一個比較簡單的方式,不過缺點就是它需要另外建立一個單獨的 R 指令稿,如果不想要另外建立一個 R 檔案,可以改用proc_open 的方式,直接把 R 的指令從 PHP 中透過 Linux 的管線(pipe)寫到 R 的行程(process)中,這樣就可以省去建立 R 檔案的麻煩,以下是一個簡單的範例:
https://blog.gtwang.org/r/integrating-php-and-r/
(第四張圖)
這個範例我們利用 proc_open 從 PHP 中開啟一個 R 的行程,在開啟新的行程之前,要先以 $descriptorspec 設定好新行程的標準輸入、標準輸出與標準錯誤,此處我們將新 R 行程的標準輸入指定為管線,方便我們直接從 PHP 寫入資料,而 R 的輸出與錯訊息則是導入兩個暫存檔中,通常在開發階段這樣可以方便我們檢視程式是否有正確執行,除錯也比較方便。
將 R 的指令都寫入 R 的行程之後,在呼叫 proc_close 關閉 R 行程之前,要記得先將所有的管線關閉,避免造成 deadlock。最後一樣照舊將圖檔顯示在網頁上,不管是使用 proc_close 還是 exec 來整合 PHP 與 R,顯示出來的效果看起來都相同,只有內部的程式結構上有些差異而已。
網頁設計.RWD響應式網站.行動版網站 / 美容保養類
網站技術:PHP . Javascript/MySql
網頁設計.RWD響應式網站 / 教育人文類
網站技術:PHP . Javascript/MySql
科教中心提供招生考試、新生入學前服務與高中接洽服務。並提供本校與區域高中、職之間能有持續且穩定交流的平台。
Line OA / 美容保養類
網站技術:PHP . Javascript/MySql
滿意寶寶LINE OA官方帳號,各位爸爸媽媽都有加入了嗎?! 只需要動動手指就可以知道官方帳號的最新資訊、商品與兌換商品。
電話:(02)2739-9096 | 傳真:(02)2739-6637 | 客服:[email protected] | 臺北市信義區和平東路3段257號6樓map
© 2019 傑立資訊 All rights reserved.| 網站隱私政策