Rev 911 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*QBPWCF, Quick Build PHP website Component base on Fedora Linux.Copyright (C) 2015~2024 Min-Jhin,ChenThis file is part of QBPWCF.QBPWCF is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.QBPWCF is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with QBPWCF. If not, see <http://www.gnu.org/licenses/>.*/namespace qbpwcf;/*類別說明:應用R的類別.備註:R的線上學習網站=>https://sites.google.com/site/rlearningsite/*/class R{/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic#備註:#無*/public function __call($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __call end/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic#備註:#無*/public static function __callStatic($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __callStatic end/*#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["function"],當前執行的函數名稱#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#$result["RscriptContent"],執行的R腳本內容,一個元素代表一列.#必填參數:#$conf["rPositionAndName"],字串,R腳本的位置與名稱.$conf["rPositionAndName"]=".R";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";#參考資料:#無.#備註:#無.*/public static function executeR(&$conf){#初始化要回傳的結果$result=array();#設置當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不等於 "array"if(gettype($conf)!="array"){#設定錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]="參數的Key指定有誤!";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#如果 $conf["disbaleOptimal"] 未設定if(!isset($conf["disbaleOptimal"])){#預設 $conf["disbaleOptimal"] 為 "false"$conf["disbaleOptimal"]="false";}#if end#檢查參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#必填寫的參數:$conf["variableCheck"]["isexistMuti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck"]["isexistMuti"]["variableCheck"]=array("rPositionAndName","fileArgu");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck"]["isexistMuti"]["variableType"]=array("string","string");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck"]["isexistMuti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck"]["isexistMuti"]);unset($conf["variableCheck"]["isexistMuti"]);#如果 $checkResult["status"] 等於 "false"if($checkResult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果 $checkResult["passed"] 等於 "false"if($checkResult["passed"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#產生暫時存放執行結果的檔案#函式說明:#檢查要建立的檔案路徑是否存在,若不存在則建立新檔案,若檔案已存在則會在原檔名後面加上從(1)開始的編號,再度嘗試建立檔案,以避免資料異常.#回傳的結果:#$result["status"],執行狀態,"true"代表執行正常,"false"代表執行失敗.#$result["error"],錯誤訊息陣列.#$result["createdFileName"],建立好的檔案名稱.#$result["createdFilePath"],檔案建立的路徑.#$result["createdFilePathAndName"].建立好的檔案名稱與路徑.#必填的參數:#$conf["checkedFileAndPath"],字串陣列,要建立的檔案路徑$conf["fileAccess"]["createFileAfterCheck"]["checkedFileAndPath"]=".R/tempOutPut";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["createFileAfterCheck"]["fileArgu"]=$conf["fileArgu"];$createTempFileOfOutput=fileAccess::createFileAfterCheck($conf["fileAccess"]["createFileAfterCheck"]);unset($conf["fileAccess"]["createFileAfterCheck"]);#如果 $createTempFileOfOutput["status"] 等於 "false"if($createTempFileOfOutput["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createTempFileOfOutput;#回傳結果return $result;}#if end#取得R腳本內容#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗。#$result["error"],錯誤訊息提示#$result["fileContent"],爲檔案的內容陣列#$result["lineCount"],爲檔案內容總共的行數#$result["fullContent"],為檔案的完整內容#必填的參數:$conf["file.getFileContent"]["filePositionAndName"]=$conf["rPositionAndName"];#爲檔案的位置以及名稱#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["file.getFileContent"]["fileArgu"]=$conf["fileArgu"];#參考資料:#file():取得檔案內容的行數#http:#php.net/manual/en/function.file.php#rtrim():剔除透過file()取得每行內容結尾的換行符號.$getRscriptContent=fileAccess::getFileContent($conf["file.getFileContent"]);unset($conf["file.getFileContent"]);#如果取得R腳本內容失敗if($getRscriptContent["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getRscriptContent;#回傳結果return $result;}#if end#取得R腳本內容$result["RscriptContent"]=$getRscriptContent["fileContent"];#初始化要執行的R指令參數$paramsArray=array();#如果要優化R的執行if($conf["disbaleOptimal"]=="false"){#設定要執行的R指令參數$paramsArray=array("--vanilla","-q","-f",$conf["rPositionAndName"],">",$createTempFileOfOutput["createdFilePathAndName"]);}#if end#反之代表不優化R的執行else{#設定要執行的R指令參數$paramsArray=array("-f",$conf["rPositionAndName"],">",$createTempFileOfOutput["createdFilePathAndName"]);}#else end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存出新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external"]["callShell"]["command"]="R";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external"]["callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external"]["callShell"]["argu"]=$paramsArray;#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external"]["callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$executionResult=external::callShell($conf["external"]["callShell"]);unset($conf["external"]["callShell"]);#如果 $executionResult["status"] 等於 "false"if($executionResult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$executionResult;#回傳結果return $result;}#if end#取得暫存檔裡面的R輸出結果#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗。#$result["error"],錯誤訊息提示#$result["fileContent"],爲檔案的內容陣列#$result["lineCount"],爲檔案內容總共的行數#$result["fullContent"],為檔案的完整內容#必填的參數:$conf["fileAccess"]["getFileContent"]["filePositionAndName"]=$createTempFileOfOutput["createdFilePathAndName"];#爲檔案的位置以及名稱#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["getFileContent"]["fileArgu"]=$conf["fileArgu"];#參考資料:#file():取得檔案內容的行數#http:#php.net/manual/en/function.file.php#rtrim():剔除透過file()取得每行內容結尾的換行符號.$readRtempOutPutFile=fileAccess::getFileContent($conf["fileAccess"]["getFileContent"]);unset($conf["fileAccess"]["getFileContent"]);#如果 $readRtempOutPutFile["status"] 等於 "false"if($readRtempOutPutFile["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$readRtempOutPutFile;#回傳結果return $result;}#if end#取得輸出內容行數$result["lineCount"]=$readRtempOutPutFile["lineCount"];#取得輸出內容陣列$result["lineArray"]=$readRtempOutPutFile["fileContent"];#移除R腳本檔案#涵式說明:#移除檔案#回傳的結果:#$result["status"],"true"代表移除成功,"false"代表移除失敗.#必填的參數:$conf["fileAccess"]["delFile"]["fileAddress"]=$conf["rPositionAndName"];#要移除檔案的位置#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["delFile"]["fileArgu"]=$conf["fileArgu"];$eraseRsh=fileAccess::delFile($conf["fileAccess"]["delFile"]);unset($conf["fileAccess"]["delFile"]);#如果 $eraseRsh["status"] 等於 "false"if($eraseRsh["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$eraseRsh;#回傳結果return $result;}#if end#移除暫存R輸出的檔案#涵式說明:#移除檔案#回傳的結果:#$result["status"],"true"代表移除成功,"false"代表移除失敗.#必填的參數:$conf["fileAccess"]["delFile"]["fileAddress"]=$createTempFileOfOutput["createdFilePathAndName"];#要移除檔案的位置#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["delFile"]["fileArgu"]=$conf["fileArgu"];$eraseRtempOutputFile=fileAccess::delFile($conf["fileAccess"]["delFile"]);unset($conf["fileAccess"]["delFile"]);#如果 $eraseRsh["status"] 等於 "false"if($eraseRtempOutputFile["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$eraseRsh;#回傳結果return $result;}#if end#執行到這邊代表執行正常$result["status"]="true";#回傳結果return $result;}#function executeR end/*#涵式說明:#展示R的文字輸出範例#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#$result["content"],執行完後的結果陣列,一個元素代表一列內容.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function demoTextOutput(&$conf=array()){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf===null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["skipableVariableName"]=array();#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["skipableVariableType"]=array();#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["skipableVarDefaultValue"]=array("");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php#建議:#增加可省略參數全部不能為空字串或空陣列的參數功能.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查參數失敗if($checkArguments["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果參數檢查不通過if($checkArguments["passed"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#建立要寫入的行內容$rCode[]="#宣告變數k,其值等於1";$rCode[]="k=1";$rCode[]="#檢視變數內容";$rCode[]="k";$rCode[]="#判斷變數k是否爲integer";$rCode[]="is.integer(k)";$rCode[]="#宣告變數k,其值等於integer型態的1";$rCode[]="k=as.integer(1)";$rCode[]="#檢視變數內容";$rCode[]="k";$rCode[]="#判斷變數k是否爲integer";$rCode[]="is.integer(k)";#涵式說明:#建立R檔案#回傳的結果:#true代表寫入成功,false代表寫入失敗#必填的參數:$conf["R"]["writeRfile"]["addAndName"]=".rOutput/rDemo.R";#R檔案的位置與名稱$conf["R"]["writeRfile"]["textToWrite"]=$rCode;#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.$conf["R"]["writeRfile"]["fileArgu"]=$conf["fileArgu"];$writeRfile=R::writeRfile($conf["R"]["writeRfile"]);unset($conf["R"]["writeRfile"]);#如果建立R腳本檔案失敗if($writeRfile["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$writeRfile;#回傳結果return $result;}#if end#呼叫系統命令使用R來執行檔案內的指令,將結果輸出到檔案裏面。#system("R <.rOutput/rDemo.R --no-save > .rOutput/".$_SESSION["username"]."-output");#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#$result["RscriptContent"],執行的R腳本內容,一個元素代表一列.#必填的參數:#$conf["R::executeR"]["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R::executeR"]["rPositionAndName"]=".rOutput/rDemo.R";#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.$conf["R::executeR"]["fileArgu"]=$conf["fileArgu"];$executeR=R::executeR($conf["R::executeR"]);unset($conf["R::executeR"]);#如果執行R腳本失敗if($executeR["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$executeR;#回傳結果return $result;}#if end#取得執行完的結果$result["content"]=$executeR["lineArray"];#設置執行正常$result["status"]="true";#回傳執行結果return $result;}#if end/*#涵式說明:#展示R的繪圖範例#回傳結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["text"],執行R所得到的文字內容.#$result["img"],顯示圖表的語法.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#無#參考資料:#無.#備註:#無*/public static function demoGraphiOutput(&$conf=array()){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf===null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["skipableVariableName"]=array();#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["skipableVariableType"]=array();#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["skipableVarDefaultValue"]=array("");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php#建議:#增加可省略參數全部不能為空字串或空陣列的參數功能.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查參數失敗if($checkArguments["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果參數檢查不通過if($checkArguments["passed"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#建立要寫入的行內容$rCode[]="#創建圖片,將繪圖的結果都存在該圖裏面";$rCode[]="svg(filename=\".rOutput/temp.svg\")";$rCode[]="#產生常態分配資料100筆";$rCode[]="y=rnorm(100,5,10)";$rCode[]="#繪製直方圖";$rCode[]="hist(y,prob=TRUE)";#涵式說明:#建立R檔案#回傳的結果:#true代表寫入成功,false代表寫入失敗#必填的參數:$conf["R"]["writeRfile"]["addAndName"]=".rOutput/rGraphiDemo.R";#R檔案的位置與名稱$conf["R"]["writeRfile"]["textToWrite"]=$rCode;#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R"]["writeRfile"]["fileArgu"]=$conf["fileArgu"];$writeRfile=R::writeRfile($conf["R"]["writeRfile"]);unset($conf["R"]["writeRfile"]);#如果建立R腳本檔案失敗if($writeRfile["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$writeRfile;#回傳結果return $result;}#if end#呼叫系統命令使用R來執行檔案內的指令,將結果輸出到檔案裏面。#system("R <.rOutput/rDemo.R --no-save > .rOutput/".$_SESSION["username"]."-output");#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#$result["RscriptContent"],執行的R腳本內容,一個元素代表一列.#必填的參數:#$conf["R::executeR"]["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R::executeR"]["rPositionAndName"]=".rOutput/rGraphiDemo.R";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R::executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";$executeR=R::executeR($conf["R::executeR"]);unset($conf["R::executeR"]);#如果執行R腳本失敗if($executeR["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$executeR;#回傳結果return $result;}#if end#印出統計圖的語法#函數說明:#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息#$result["content"],圖片的連結資訊#$result["function"],當前執行的函數名稱#必填參數:#$conf["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱$conf["img::data"]["imgPosition"]=".rOutput/temp.svg";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["img::data"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["alt"],若沒有圖片要用什麼文字顯示。#$conf["alt"]="";#$conf["style"],字串陣列,要使用的style,key為樣式名稱,value為樣式值.$conf["img::data"]["style"]=array("width"=>"100%");#$conf["class"],圖片要套用的css樣式名稱.#$conf["class"]="";#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".$conf["img::data"]["mimeType"]="image/svg+xml";#$conf["compressType"],2元碼壓縮的方式,預設為"base64".#$conf["compressType"]="base64";#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".$conf["img::data"]["delImg"]="false";#參考資料:#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php$data=img::data($conf["img::data"]);unset($conf["img::data"]);#如果顯示圖片失敗if($data["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$data;#回傳結果return $result;}#if end#取得執行R過後的結果$result["text"]=$executeR["lineArray"];#取得顯示圖表的語法$result["img"]=$data["content"];#設置執行正常$result["status"]="true";#回傳結果return $result;}#function demoGraphiOutput end/*#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填參數:#$conf["addAndName"],字串,檔案的位置與名稱,"folderName/fileName.R"$conf["addAndName"]="";#$conf["textToWrite"],字串陣列,要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行.$conf["textToWrite"]=array("");#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數#無.#參考資料:#無.#備註:#無.*/public static function writeRfile(&$conf=array()){#初始化要回傳的結果$result=array();#設置當前執行的涵式$result["function"]=__FUNCTION__;#如果 $conf 不等於 "array"if(gettype($conf)!="array"){#設定錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]="參數的Key指定有誤!";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#必填寫的參數:$conf["variableCheck"]["isexistMuti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck"]["isexistMuti"]["variableCheck"]=array("addAndName","textToWrite","fileArgu");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck"]["isexistMuti"]["variableType"]=array("string","array","string");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck"]["isexistMuti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck"]["isexistMuti"]);unset($conf["variableCheck"]["isexistMuti"]);#如果 $checkResult["status"] 等於 "false"if($checkResult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果 $checkResult["passed"] 等於 "false"if($checkResult["passed"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#建立R腳本檔#函式說明:#檢查要建立的檔案路徑是否存在,若不存在則建立新檔案,若檔案已存在則會在原檔名後面加上從(1)開始的編號,再度嘗試建立檔案,以避免資料異常.#回傳的結果:#$result["status"],執行狀態,"true"代表執行正常,"false"代表執行失敗.#$result["error"],錯誤訊息陣列.#$result["createdFileName"],建立好的檔案名稱.#$result["createdFilePath"],檔案建立的路徑.#$result["createdFilePathAndName"].建立好的檔案名稱與路徑.#必填的參數:#$conf["checkedFileAndPath"],字串陣列,要建立的檔案路徑$conf["fileAccess"]["createFileAfterCheck"]["checkedFileAndPath"]=$conf["addAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["createFileAfterCheck"]["fileArgu"]=$conf["fileArgu"];$createResult=fileAccess::createFileAfterCheck($conf["fileAccess"]["createFileAfterCheck"]);unset($conf["fileAccess"]["createFileAfterCheck"]);#如果R腳本檔案建立失敗if($createResult["status"]=="false"){#建立錯誤識別$result["status"]="false";#建立錯誤訊息$result["error"]=$createResult;#回傳結果return $result;}#if end#取得R腳本檔的位置與名稱$result["newCreatedRfilePathAndName"]=$createResult["createdFilePathAndName"];#針對$conf["textToWrite"]的每個元素foreach($conf["textToWrite"] as $key=>$value){#涵式說明:#將字串寫入到檔案#回傳的結果:#$result,true表示檔案建立成功,false表示檔案建立失敗#必填的參數:$conf["fileAccess"]["writeTextIntoFile"]["fileName"]=$result["newCreatedRfilePathAndName"];#爲要編輯的檔案名稱$conf["fileAccess"]["writeTextIntoFile"]["inputString"]=$value."\r\n";#爲要寫入到裏面的內容,若要每筆資料寫入後換行,則可以在字串內容後面加上 \r\n 即可。$conf["fileAccess"]["writeTextIntoFile"]["writeMethod"]="a";#爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["writeTextIntoFile"]["fileArgu"]=$conf["fileArgu"];$writeFileresult=fileAccess::writeTextIntoFile($conf["fileAccess"]["writeTextIntoFile"]);unset($conf["fileAccess"]["writeTextIntoFile"]);#如果 寫入結果爲 "false"if($writeFileresult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"][]="寫入檔案失敗,可能http沒有權限,或 ".$conf["addAndName"]." 檔案不存在.";#回傳結果return $result;}#if end}#foreach end#執行到這邊代表執行成功$result["status"]="true";#回傳結果return $result;}#function createRfile end/*#函式說明:#針對csv樣本檔作決策樹分析,可以設定分析完後是否要刪除csv樣本檔.#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["lineArray"],執行結果輸出的逐行內容.#$result["lineCount"],執行結果輸出的行數.#$result["content"],顯示圖表的語法.#$result["img"],圖表的位置與名稱#必填參數:#$conf["inputCsvFilePosition"],字串,csv資料檔的路徑與名稱,資料檔的第一欄為各變數的標題.$conf["inputCsvFilePosition"]=".csv";#$conf["targetVar"],字串,要預測的變數名稱.$conf["targetVar"]="";#$conf["independentVar"],陣列字串,用來預測的變數名稱陣列.$conf["independentVar"]=array();#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["trainDataPercent"],字串,訓練資料要佔多少,預設為"0.7".#$conf["trainDataPercent"]="0.7";#$conf["testDataPercent"],字串,測試資料要佔多少,預設"0.3".#$conf["testDataPercent"]="0.3";#$conf["trainDataReportImgPositionAndName"],字串,決策樹分析訓練資料後的關聯圖表輸出位置與名稱,預設為"report.png".#$conf["trainDataReportImgPositionAndName"]="report.png";#$conf["delSampleCsvFile"],字串,是否要在分析結束後,移除樣本csv檔案,預設為"false"不移除,"true"則代表要移除.#$conf["delSampleCsvFile"]="false";#參考資料:#R的決策樹分析範例=>http://www.rdatamining.com/examples/decision-tree#備註:#測試資料分析尚未撰寫*/public static function decisionTreeWithPackageParty(&$conf){#初始化要回傳的結果$result=array();#取得當前執行函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#必填寫的參數:$conf["variableCheck"]["isexistMuti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck"]["isexistMuti"]["variableCheck"]=array("fileArgu","inputCsvFilePosition","targetVar","independentVar");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck"]["isexistMuti"]["variableType"]=array("string","string","string","array");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck"]["isexistMuti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck"]["isexistMuti"]);unset($conf["variableCheck"]["isexistMuti"]);#如果 $checkResult["status"] 等於 "false"if($checkResult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果 $checkResult["passed"] 等於 "false"if($checkResult["passed"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果 $conf["trainDataPercent"] 未設定if(!isset($conf["trainDataPercent"])){#預設為 0.7$conf["trainDataPercent"]="0.7";}#if end#如果 $conf["testDataPercent"] 未設定if(!isset($conf["testDataPercent"])){#預設為 0.3$conf["testDataPercent"]="0.3";}#if end#如果 $conf["trainDataReportImgPositionAndName"] 未設定if(!isset($conf["trainDataReportImgPositionAndName"])){#預設為 trainDataReport.png$conf["trainDataReportImgPositionAndName"]="report.png";}#if end#如果 $conf["delSampleCsvFile"] 未設定if(!isset($conf["delSampleCsvFile"])){#預設為 "false"$conf["delSampleCsvFile"]="false";}#if end#初始化要寫入到R腳本的內容$rCode=array();#讀取 csv檔的內容$rCode[]="Data <- read.csv(\"".$conf["inputCsvFilePosition"]."\")";#分割讀到的資料檔為訓練資料、測試資料$rCode[]="ind <- sample(2, nrow(Data), replace=TRUE, prob=c(".$conf["trainDataPercent"].",".$conf["testDataPercent"]."))";#將Data的第一組資料,亦即70%的Data資料放置到trainData裡面作為訓練資料。$rCode[]="trainData <- Data[ind==1,]";#將Data的第二組資料,亦即30%的Data資料放置到testData裡面作為測試資料。$rCode[]="testData <- Data[ind==2,]";#使用 party 套件,內包含 ctree()與predict()$rCode[]="library(party)";#建立要預測變數的字串#myFormula指定 $conf["targetVar"] 為被預測變數,其他變數則為獨立變數.$formula="myFormula <- ".$conf["targetVar"]." ~ ";#初始化獨立變數的字串$independentStr="";#建立獨立變數字串for($i=0;$i<count($conf["independentVar"]);$i++){#串連獨立變數字串$independentStr=$independentStr." + ".$conf["independentVar"][$i];}#for end#儲存要預測變數與獨立變數到R腳本裡面$rCode[]=$formula.$independentStr;#使用 ctree 建立決策樹,被預測變數與預測變數的設定存在myFormula,用來建立決策樹的資料為儲存在trainData的資料$rCode[]="Data_ctree <- ctree(myFormula, data=trainData)";#用表來檢測預測的狀態$rCode[]="table(predict(Data_ctree), trainData$".$conf["targetVar"].")";#輸出文字模式的決策樹結果$rCode[]="print(Data_ctree)";#指定等等繪製出來的圖表要儲存在哪邊,寬度與高度為何。$rCode[]="svg(filename=\"".$conf["trainDataReportImgPositionAndName"]."\")";#畫出詳細版的決策樹結果,含預測出來的變數內容為何。$rCode[]="plot(Data_ctree)";#預測測試資料$rCode[]="testPred <- predict(Data_ctree, newdata = testData)";$rCode[]="table(testPred, testData$".$conf["targetVar"].")";#寫入R腳本的內容#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R"]["writeRfile"]["addAndName"]=".R/party-".$_SESSION["username"]."-.R";#R檔案的位置與名稱$conf["R"]["writeRfile"]["textToWrite"]=$rCode;#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R"]["writeRfile"]["fileArgu"]=$conf["fileArgu"];$writeRfileResult=R::writeRfile($conf["R"]["writeRfile"]);unset($conf["R"]["writeRfile"]);#var_dump($writeRfileResult);#如果 $writeRfileResult["status"] 等於 "false"if($writeRfileResult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeRfileResult;#回傳結果return $result;}#if end#執行 R 腳本#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R"]["executeR"]["rPositionAndName"]=$writeRfileResult["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R"]["executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["R"]["executeR"]["disbaleOptimal"]="true";$executeRresult=R::executeR($conf["R"]["executeR"]);unset($conf["R"]["executeR"]);#如果 $executeRresult["status"] 等於 "false"if($executeRresult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$executeRresult;#回傳結果return $result;}#if end#如果 $conf["delSampleCsvFile"] 等於 "true"if($conf["delSampleCsvFile"]=="true"){#則要移除樣本csv檔案#涵式說明:#移除檔案#回傳的結果:#$result["status"],"true"代表移除成功,"false"代表移除失敗.#必填的參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["delFile"]["fileArgu"]=$conf["fileArgu"];$conf["fileAccess"]["delFile"]["fileAddress"]=$conf["inputCsvFilePosition"];#要移除檔案的位置$eraseSampleCsvResult=fileAccess::delFile($conf["fileAccess"]["delFile"]);unset($conf["fileAccess"]["delFile"]);#如果 $eraseSampleCsvResult["status"] 等於 "false"if($eraseSampleCsvResult["status"]=="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$eraseSampleCsvResult;#回傳結果return $result;}#if end}#if end#取得 R 的執行結果$result["lineArray"]=$executeRresult["lineArray"];#取得 R 的執行結果行數$result["lineCount"]=$executeRresult["lineCount"];#取得圖表的位置$result["img"]=$conf["trainDataReportImgPositionAndName"];#放置圖表的語法#函數說明:#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息#$result["content"],圖片的連結資訊#$result["function"],當前執行的函數名稱#必填參數:#$conf["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱$conf["img::data"]["imgPosition"]=$conf["trainDataReportImgPositionAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["img::data"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["alt"],若沒有圖片要用什麼文字顯示。#$conf["alt"]="";#$conf["style"],字串陣列,要使用的style,key為樣式名稱,value為樣式值.$conf["img::data"]["style"]=array("width"=>"100%");#$conf["class"],圖片要套用的css樣式名稱.#$conf["class"]="";#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".$conf["img::data"]["mimeType"]="image/svg+xml";#$conf["compressType"],2元碼壓縮的方式,預設為"base64".#$conf["compressType"]="base64";#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".#$conf["delImg"]="false";#參考資料:#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php$data=img::data($conf["img::data"]);unset($conf["img::data"]);#如果顯示圖片失敗if($data["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$data;#回傳結果return $result;}#if end#放置圖表的語法$result["content"]=$data["content"];#執行到這邊代表執行正常$result["status"]="true";#回傳結果return $result;}#function DecisionTreeWithPackageParty end/*#函式說明:#依據樣本內容進行選項內容次數的統計#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["content"],回傳的內容#$result["content"][$i]["title"],第$+1個欄位的題目。#$result["content"][$i][$j]["optionValue"],第$+1個欄位的第$j+1個選項的內容。#$result["content"][$i][$j]["optionCount"],第$+1個欄位的第$j+1個選項的出現頻率。#$result["content"][$i][$j]["optionPercent"],第$+1個欄位的第$j+1個選項的出現次數所佔全部選項的百分比。#$result["content"]["questCount"],題目計數#必填參數:#$conf["csvFileAddress"],字串,csv檔的位置與名稱$conf["csvFileAddress"]=".csv";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#參考資料:#R的敘述統計=>http://netstat.stat.tku.edu.tw/desc.php#備註:#目前欄位中文名稱讀出來會變成亂碼,因此建議交由php讀檔時就取得其欄位中文名稱*/public static function describedStatistic(&$conf){#初始化要回傳的結果$result=array();#取得當前執行函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:$conf["variableCheck.isexistMulti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck.isexistMulti"]["variableCheck"]=array("csvFileAddress","fileArgu");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck.isexistMulti"]["variableType"]=array("string","string");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck.isexistMulti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck.isexistMulti"]);unset($conf["variableCheck.isexistMulti"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查失敗if($checkResult["passed"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkResult;#回傳結果return $result;}#if end#檢查csv檔案是否存在#涵式說明:檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["varName"][$i],爲第$i個資料夾或檔案的名稱。#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填的參數:$conf["fileAccess.checkMultiFileExist"]["fileArray"]=array($conf["csvFileAddress"]);#要檢查書否存在的檔案有哪些,須爲一維陣列數值。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.checkMultiFileExist"]["fileArgu"]=$conf["fileArgu"];#參考資料來源:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php$checkResult=fileAccess::checkMultiFileExist($conf["fileAccess.checkMultiFileExist"]);unset($conf["fileAccess.checkMultiFileExist"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查失敗if($checkResult["varExist"][0]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkResult;#回傳結果return $result;}#if end#讀取csv檔案的內容#回傳得結果:#$result["status"],執行是否正常,"true"代表正常;"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["csvFileContent"],csv檔案內容的陣列.#$result["csvFileContent"]["$i"]["$j"]代表第$i+1列第$j+1欄位的內容.#如果 $conf["firstLineVarName"]爲"true"的話則會多回傳 $result["csvFileContent"]["第幾列"]["第一列各個欄位的名稱"]#$result["lineArray"],csv檔案逐列內容的陣列.#$result["lineArrayCount"],總共幾列資料.#必填的參數:$conf["csv.loadCsvFile"]["csvFilePositionAndName"]=$conf["csvFileAddress"];#csv檔案的位置#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["csv.loadCsvFile"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:$conf["csv.loadCsvFile"]["firstLineVarName"]="false";#第一行是否爲變數名稱(各個欄位的名稱)#參考資料來源:#http://www.php.net/manual/en/function.str-split.php#參考資料來源#http://chuangmaster.pixnet.net/blog/post/33560606-%5B%E8%BD%89%E8%B2%BC%5D%E9%97%9C%E6%96%BC%E5%9B%9E%E8%BB%8A(%5Cr)%E8%88%87%E6%8F%9B%E8%A1%8C(%5Cn)$readCsvResult=csv::loadCsvFile($conf["csv.loadCsvFile"]);unset($conf["csv.loadCsvFile"]);#var_dump($readCsvResult);#如果 $readCsvResult["status"] 等於 "false"if($readCsvResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$readCsvResult;#回傳結果return $result;}#if end#宣告儲存csv檔標題欄名稱的陣列$columnNameList=array();#迴圈從i等等於1到不小於count($readCsvResult["csvFileContent"][0])為止#亦即第二欄到最後一欄for($i=1;$i<count($readCsvResult["csvFileContent"][0]);$i++){#紀錄第$i+1欄的欄位名稱$columnNameList[]=$readCsvResult["csvFileContent"][0][$i];}#for end#初始化要寫入到R腳本的逐行內容$dataToWrite=array();#讀取 $conf["csvFileAddress"] 檔案,進行敘述性統計$dataToWrite[]="data=read.csv(file=\"".$conf["csvFileAddress"]."\",header=TRUE)";#取得csv檔有幾欄內容$dataToWrite[]="columnCount=dim(data)[2]";#迴圈開始,執行第2欄到第 columnCount 欄$dataToWrite[]="for(i in 2:columnCount){";#迴圈內容#對第i欄進行敘述行統計#印出來$dataToWrite[]="write.table(table(data[i]),sep=\",\")";#迴圈結束$dataToWrite[]="}";#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R.writeRfile"]["addAndName"]=".R/".$_SESSION["username"]."-describedStatistic.R";#R檔案的位置與名稱$conf["R.writeRfile"]["textToWrite"]=$dataToWrite;#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];$createRscriptResult=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#如果建立 R腳本 失敗if($createRscriptResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$createRscriptResult;#回傳結果return $result;}#if end#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["R.executeR"]["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$createRscriptResult["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["R.executeR"]["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["R.executeR"]["disbaleOptimal"]="true";$excuteRscriptResult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行 R腳本 失敗if($excuteRscriptResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$excuteRscriptResult;#回傳結果return $result;}#if end#debug#var_dump($excuteRscriptResult);#宣告識別要開始抓取內容的旗標變數$columnStatisticData=array();#初始化欄位計數$columnCount=-1;#初始化選項計數$optionCount=1;#解析從R取得的結果for($i=5;$i<count($excuteRscriptResult["lineArray"]);$i++){#如果讀到 ""Var1","Freq""if($excuteRscriptResult["lineArray"][$i]=="\"Var1\",\"Freq\""){#欄位計數加1$columnCount++;#初始化選項計數$optionCount=1;#跳過該次迴圈continue;}#if end#如果讀到 "Freq"if($excuteRscriptResult["lineArray"][$i]=="\"Freq\""){#欄位計數加1$columnCount++;#初始化選項計數$optionCount=1;#跳過該次迴圈continue;}#if end#取得題目$columnStatisticData[$columnCount]["title"]=$columnNameList[$columnCount];#取得要解析的字串$dataNeedToFilted=$excuteRscriptResult["lineArray"][$i];#debug#var_dump($dataNeedToFilted);#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$dataNeedToFilted;#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]=",";#爲以哪個符號作爲分割$spiltedStr=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#debug#var_dump($spiltedStr);#若 $spiltedStr["status"] 等於 "false"if($spiltedStr["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$spiltedStr;#回傳結果return $result;}#if end#如果 $spiltedStr["dataCounts"]<=1if($spiltedStr["dataCounts"]<=1){#欄位計數加1#$columnCount++;#跳過該次迴圈continue;}#if end#處理選項名稱不必要的內容#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess.correctCharacter"]["stringIn"]=$spiltedStr["dataArray"][1];#爲要處理的字串#可省略的參數:$conf["stringProcess.correctCharacter"]["selectedCharacter"]=array("\"");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess.correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$spiltedStr["dataArray"][1]=stringProcess::correctCharacter($conf["stringProcess.correctCharacter"]);unset($conf["stringProcess.correctCharacter"]);#如果修正內容失敗if($spiltedStr["dataArray"][1]["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$spiltedStr["dataArray"][1];#回傳結果return $result;}#if end#如果選項爲 $spiltedStr["dataArray"][1]["content"] 等於 ""if($spiltedStr["dataArray"][1]["content"]==""){#設爲空值$spiltedStr["dataArray"][1]["content"]="空值";}#if end#處理選項名稱不必要的內容#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result,爲處理好的字串。#必填的參數:$conf["stringProcess.correctCharacter"]["stringIn"]=$spiltedStr["dataArray"][2];#爲要處理的字串#可省略的參數:$conf["stringProcess.correctCharacter"]["selectedCharacter"]=array("\"");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess.correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$spiltedStr["dataArray"][2]=stringProcess::correctCharacter($conf["stringProcess.correctCharacter"]);unset($conf["stringProcess.correctCharacter"]);#如果修正內容失敗if($spiltedStr["dataArray"][2]["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$spiltedStr["dataArray"][2];#回傳結果return $result;}#if end#以整數key紀錄選項名稱$columnStatisticData[$columnCount][$optionCount]["optionValue"]=$spiltedStr["dataArray"][1]["content"];#以整數key紀錄選項頻率$columnStatisticData[$columnCount][$optionCount]["optionCount"]=$spiltedStr["dataArray"][2]["content"];#選項計數加1$optionCount++;#debug#var_dump($columnStatisticData[$columnCount]);#排序含有選項名稱與頻率的二維陣列#函數說明:#排序含有多資訊的二維陣列#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的function名稱#$result["error"],錯誤訊息陣列.#$result["content"],處理好的字串.#必填參數:#$conf["arrays.arrangeTwoDmensionArray"]["unArrangeArray"],參考二維陣列,要的排序二維陣列。$conf["arrays.arrangeTwoDmensionArray"]["unArrangeArray"]=&$columnStatisticData[$columnCount];#$conf["arrays.arrangeTwoDmensionArray"]["compareKey"],字串,儲存用來比較大小的一維陣列key名稱。$conf["arrays.arrangeTwoDmensionArray"]["compareKey"]="optionCount";#可省參數:#$conf["arrays.arrangeTwoDmensionArray"]["type"],字串,排序的類型,"asc"代表遞增,"desc"代表遞減,預設為"desc"。$conf["arrays.arrangeTwoDmensionArray"]["type"]="desc";$arrangedResult=arrays::arrangeTwoDmensionArray($conf["arrays.arrangeTwoDmensionArray"]);unset($conf["arrays.arrangeTwoDmensionArray"]);#如果排序失敗if($arrangedResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$arrangedResult;#回傳結果return $result;}#if end}#for end#debug#var_dump(count($columnStatisticData));#計算每個題目各選項所佔的百分比for($i=0;$i<count($columnStatisticData);$i++){#初始化總共的選項填達次數$total=0;#如果該題有填答的記錄if(isset($columnStatisticData[$i])){#有幾個選項就執行幾次#-1是因爲title的關係for($j=1;$j<=count($columnStatisticData[$i])-1;$j++){#如果 $columnStatisticData[$i][$j]["optionValue"] 不等於 "空值"if($columnStatisticData[$i][$j]["optionValue"]!="空值"){#加總填達次數$total=$total+$columnStatisticData[$i][$j]["optionCount"];}#if end}#for end#有幾個選項就執行幾次for($j=1;$j<count($columnStatisticData[$i]);$j++){#如果 $columnStatisticData[$i][$j]["optionValue"] 不等於 "空值"if($columnStatisticData[$i][$j]["optionValue"]!="空值"){#取得選項的填達比率$columnStatisticData[$i][$j]["optionPercent"]=$columnStatisticData[$i][$j]["optionCount"]/$total;}#if end}#for end}#if end}#for end#設置要回傳的內容$result["content"]=$columnStatisticData;#取得題項數目的計數$result["content"]["questCount"]=count($result["content"]);#設置執行成功$reuslt["status"]="true";#回傳結果return $result;}#function decriptionStatistic end/*#函式說明:#繪製圓餅圖#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["content"],放置圖片的語法#$result["img"],圖表的位置與名稱#必填參數:#$conf["percentArray"],要變成圓餅圖的數據,R會自動計算比例.$conf["percentArray"]=array();#$conf["labels"],字串陣列,比例名稱.$conf["labels"]=array();#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["pngFileName"],字串,圖片存放的位置與名稱,預設爲 "pie-".$SESSION["username"]."png"#$conf["pngFileName"]=".R/pie-".$SESSION["username"]."png";#$conf["pieTitle"],字串,圓餅圖的標題,預設爲空。#$conf["pieTitle"]="";#參考資料:#無.#備註:#無*/public static function createPie(&$conf){#初始化要回傳的內容$result=array();#取得當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查必填的參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:$conf["variableCheck.isexistMulti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck.isexistMulti"]["variableCheck"]=array("fileArgu","percentArray","labels");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck.isexistMulti"]["variableType"]=array("string","array","array");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck.isexistMulti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck.isexistMulti"]);unset($conf["variableCheck.isexistMulti"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果 $_SESSION["username"] 不存在if(!isset($_SESSION["username"])){#設為"NULL"$_SESSION["username"]="NULL";}#if end#檢查可省略的參數#函式說明:#檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。#必填參數:#$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?$conf["variableCheck.checkSkipableVarType"]["checkedVar"]=$conf;#$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.$conf["variableCheck.checkSkipableVarType"]["sikpableVarNameArray"]=array("pngFileName","pieTitle");#$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何?$conf["variableCheck.checkSkipableVarType"]["skipableVarTypeArray"]=array("string","string");#$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).$argu=&$conf;#可省略參數:#$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"],字串陣列,每個不存的變數要初始化為什麼,"null"代表不指定.$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"]=array(".R/pie-".$_SESSION["username"].".png"," ");#無$checkResult=variableCheck::checkSkipableVarType($conf["variableCheck.checkSkipableVarType"],$argu);unset($conf["variableCheck.checkSkipableVarType"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#初始化 percent 字串$percent="percent=c(";#初始化 labels 字串$labels="labels=c(";#有幾個比例陣列就執行幾次for($i=0;$i<count($conf["percentArray"]);$i++){#如果不是最後一個比例if($i!=count($conf["percentArray"])-1){#串接比例,結尾加逗號$percent=$percent.$conf["percentArray"][$i].",";#串接比例名稱,結尾加逗號$labels=$labels."\"".$conf["labels"][$i]."\",";}#if end#反之是最後一個比例else{#串接比例,最後面加上)$percent=$percent.$conf["percentArray"][$i].")";#串接比例名稱,最後面加上)$labels=$labels."\"".$conf["labels"][$i]."\")";}#else end}#for end#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R.writeRfile"]["addAndName"]=".R/pie-".$_SESSION["username"].".R";#R檔案的位置與名稱$conf["R.writeRfile"]["textToWrite"][]="#pie圓餅圖";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#比例資料,總和須爲1";$conf["R.writeRfile"]["textToWrite"][]=$percent;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#比例資料對應的名稱向量";$conf["R.writeRfile"]["textToWrite"][]=$labels;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#轉換成UTF-8";$conf["R.writeRfile"]["textToWrite"][]="Encoding(labels)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#設置圖片輸出的設定";$conf["R.writeRfile"]["textToWrite"][]="svg(filename=\"".$conf["pngFileName"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#繪製圓餅圖";$conf["R.writeRfile"]["textToWrite"][]="#比例資料爲 percent 向量";$conf["R.writeRfile"]["textToWrite"][]="#比例資料的名稱爲 labels 向量";$conf["R.writeRfile"]["textToWrite"][]="#從12點開始順時針依據少到多排序";$conf["R.writeRfile"]["textToWrite"][]="#圖的標題爲 \"系統整體感覺\"";$conf["R.writeRfile"]["textToWrite"][]="pie(percent,label=labels,clockwise=1,main=\"".$conf["pieTitle"]."\");";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#關閉繪圖裝置";$conf["R.writeRfile"]["textToWrite"][]="dev.off()";#$conf["textToWrite"],要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];$rScriptCreateResult=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#如果R腳本檔建立失敗if($rScriptCreateResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$rScriptCreateResult;#回傳結果return $result;}#if end#執行R腳本#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$rScriptCreateResult["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";$executeRresult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行R失敗if($executeRresult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$executeRresult;#回傳結果return $result;}#if end#檢查圖片檔案是否有產生#涵式說明:檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["varName"][$i],爲第$i個資料夾或檔案的名稱。#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填的參數:$conf["fileAccess.checkMultiFileExist"]["fileArray"]=array($conf["pngFileName"]);#要檢查書否存在的檔案有哪些,須爲一維陣列數值。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.checkMultiFileExist"]["fileArgu"]=$conf["fileArgu"];#參考資料來源:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php$fileCheckResult=fileAccess::checkMultiFileExist($conf["fileAccess.checkMultiFileExist"]);unset($conf["fileAccess.checkMultiFileExist"]);#如果檢查圖片失敗if($fileCheckResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$fileCheckResult;#回傳結果return $result;}#if end#如果要產生的圖片不存在if($fileCheckResult["varExist"][0]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$fileCheckResult;#回傳結果return $result;}#if end#取得圖表的位置與名稱$result["img"]=$conf["pngFileName"];#函數說明:#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息#$result["content"],圖片的連結資訊#$result["function"],當前執行的函數名稱#必填參數:#$conf["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱$conf["img::data"]["imgPosition"]=$conf["pngFileName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["img::data"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["alt"],若沒有圖片要用什麼文字顯示。#$conf["alt"]="";#$conf["style"],字串陣列,要使用的style,key為樣式名稱,value為樣式值.$conf["img::data"]["style"]=array("width"=>"100%");#$conf["class"],圖片要套用的css樣式名稱.#$conf["class"]="";#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".$conf["img::data"]["mimeType"]="image/svg+xml";#$conf["compressType"],2元碼壓縮的方式,預設為"base64".#$conf["compressType"]="base64";#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".#$conf["img::data"]["delImg"]="false";#參考資料:#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php$data=img::data($conf["img::data"]);unset($conf["img::data"]);#如果顯示圖片失敗if($data["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$data;#回傳結果return $result;}#if end#取得顯示圖片的語法$result["content"]=$data["content"];#執行到這邊代表執行正常$result["status"]="true";#回傳結果return $result;}#function createPie end/*#函式說明:#繪製長條圖#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["img"],圖片的位置與名稱#$result["content"],放置圖表的語法#必填參數:#$conf["countArray"],字串陣列,每個要呈現資料的次數,請輸入大於零的整數.$conf["countArray"]=array();#$conf["countNameArray"],字串陣列,每個要呈現資料的名稱.$conf["countNameArray"]=array();#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["imgFileName"],字串,圖片存放的位置與名稱,預設爲 "pie-".$SESSION["username"].".png",若 $SESSION["username"] 不存在則會用 "NULL" 替代#$conf["imgFileName"]=".R/barplot-".$SESSION["username"].".png";#$conf["del"],字串,是否要讀取完圖片後就把圖片檔案移除,"false"代表不要,"true"代表要,預設為"true".#$conf["del"]="true";#$conf["barPlotTitle"],字串,長條圖的標題,預設爲空。#$conf["barPlotTitle"]="";#$conf["xlabName"],x軸的名稱,預設爲項目#$conf["xlabName"]="項目";#$conf["ylabName"],y軸的名稱,預設爲頻率#$conf["ylabName"]="頻率";#$conf["autoRadioByCountArray"],字串,是否要自動計算與呈現每個項目在當前長條所有項目中的比例,"true"為要顯示,"false"為不顯示,預設為"true".#$conf["autoRadioByCountArray"]="true";#$conf["disableText"],字串,是否要取消圖例的顯示,直接顯示項目名稱在長條圖裡面,"true"代表要取消圖例,"false"代表不取消圖例,預設為"false".#$conf["disableText"]="true";#$conf["picWidth"],字串,圖片的寬度(px),預設為不指定.#$conf["picWidth"]="";#$conf["picHeight"],字串,圖片的高度(px),預設為不指定.#$conf["picHeight"]="";#$conf["line"],二維字串陣列,代表要在圖上面畫幾條線#$conf["line"]=array();#$conf["line"][$i],一維字串陣列,代表要在圖上劃第$i+1條線的資訊#$conf["line"][$i]["startX"],整數,代表線條起始點的X軸坐標.#$conf["line"][$i]["startY"],整數,代表線條起始點的Y軸坐標.#$conf["line"][$i]["endX"],整數,代表線條終點的X軸坐標.#$conf["line"][$i]["endY"],整數,代表線條終點的Y軸坐標.#$conf["line"][$i]["color"],顏色,目前有black,green,red三種#參考資料:#無.#備註:#無*/public static function createBarPlot(&$conf){#初始化要回傳的內容$result=array();#取得當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查必填的參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:$conf["variableCheck.isexistMulti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck.isexistMulti"]["variableCheck"]=array("fileArgu","countArray","countNameArray");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck.isexistMulti"]["variableType"]=array("string","array","array");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck.isexistMulti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck.isexistMulti"]);unset($conf["variableCheck.isexistMulti"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果 $_SESSION["username"] 不存在if(!isset($_SESSION["username"])){#設為"NULL"$_SESSION["username"]="NULL";}#if end#取得最高的頻率#涵式說明:#找最大值,結果會回傳最大值.#回傳的結果:#$result["status"],執行是否正常,"true"為正常,"false"為不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["key"],最大值原先的key.#$result["value"],最大值的數字.#必填的參數:$conf["math::getMaxValue"]["rawDataArray"]=$conf["countArray"];#爲原始數據$getMaxValue=math::getMaxValue($conf["math::getMaxValue"]);unset($conf["math::getMaxValue"]);#如果取得最大值失敗if($getMaxValue["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getMaxValue;#回傳結果return $result;}#if end#取得頻率最大值$maxFreq=$getMaxValue["value"];#取得最低的頻率#涵式說明#找最小值,結果會回傳最小值#回傳的內容#$result["status"],執行是否正常,"true"為正常,"false"為不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["key"],最大值原先的key.#$result["value"],陣列裏面最小的數值.#必填的參數:$conf["max::getMinValue"]["rawDataArray"]=$conf["countArray"];#爲原始數據$getMinValue=math::getMinValue($conf["max::getMinValue"]);unset($conf["max::getMinValue"]);#如果取得最小值失敗if($getMinValue["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getMaxValue;#回傳結果return $result;}#if end#取得頻率最小值$minFreq=$getMinValue["value"];#debug#var_dump($maxFreq);#var_dump($minFreq);#檢查可省略的參數#函式說明:#檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。#必填參數:#$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?$conf["variableCheck.checkSkipableVarType"]["checkedVar"]=$conf;#$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.$conf["variableCheck.checkSkipableVarType"]["sikpableVarNameArray"]=array("imgFileName","del","barPlotTitle","xlabName","ylabName","autoRadioByCountArray","picWidth","picHeight","line","disableText");#$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何?$conf["variableCheck.checkSkipableVarType"]["skipableVarTypeArray"]=array("string","del","string","string","string","string","string","string","array","string");#$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).$argu=&$conf;#可省略參數:#$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"],字串陣列,每個不存的變數要初始化為什麼,null代表不指定.$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"]=array(".R/barplot-".$_SESSION["username"].".png","true"," ","項目","頻率","true",null,null,null,"false");#無$checkResult=variableCheck::checkSkipableVarType($conf["variableCheck.checkSkipableVarType"],$argu);unset($conf["variableCheck.checkSkipableVarType"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#初始化總頻率$totalCount=0;#有幾個要統計的物件陣列就執行幾次for($i=0;$i<count($conf["countArray"]);$i++){#加總頻率$totalCount=$totalCount+$conf["countArray"][$i];}#for end#初始化 $counts 字串$counts="count=c(";#初始化 $labels 字串$labels="timeLabel=c(";#初始化 $legendStr 字串$legendStr="legendStr=c(";#有幾個要統計的物件陣列就執行幾次for($i=0;$i<count($conf["countArray"]);$i++){#如果不是最後一個要統計的物件if($i!=count($conf["countArray"])-1){#串接頻率,結尾加逗號$counts=$counts."".$conf["countArray"][$i].",";#如果 $conf["autoRadioByCountArray"] 等於 "true"if($conf["autoRadioByCountArray"]=="true"){#串接含有比例的輔助說明文字,結尾加逗號$legendStr=$legendStr."\"".$i."->".$conf["countNameArray"][$i]."(".$conf["ylabName"]."=".$conf["countArray"][$i].",比例=".round($conf["countArray"][$i]/$totalCount,2).")\",";}#if end#反之else{#串接輔助說明文字,結尾加逗號$legendStr=$legendStr."\"".$i."->".$conf["countNameArray"][$i]."(".$conf["ylabName"]."=".$conf["countArray"][$i].")\",";}#else end#如果要取消圖例if($conf["disableText"]=="true"){#如果 $conf["autoRadioByCountArray"] 等於 "true"if($conf["autoRadioByCountArray"]=="true"){#串接項目的名稱$labels=$labels."\"".$conf["countNameArray"][$i]."\r\n".$conf["ylabName"]."=".$conf["countArray"][$i]."(比例=".round($conf["countArray"][$i]/$totalCount,2).")\",";}#if end#反之 不需要比例資訊else{#串接項目的名稱$labels=$labels."\"".$conf["countNameArray"][$i]."\r\n".$conf["ylabName"]."=".$conf["countArray"][$i]."\",";}#else end}#if end#反之不要取消圖例else{#串接物件名稱,結尾加逗號$labels=$labels."\"".$i."\",";}#else end}#if end#反之是最後一個物件else{#串接頻率,最後面加上)$counts=$counts.$conf["countArray"][$i].")";#如果 $conf["autoRadioByCountArray"] 等於 "true"if($conf["autoRadioByCountArray"]=="true"){#串接含有比例的輔助說明文字$legendStr=$legendStr."\"".$i."->".$conf["countNameArray"][$i]."(".$conf["ylabName"]."=".$conf["countArray"][$i].",比例=".round($conf["countArray"][$i]/$totalCount,2).")\")";}#if end#反之else{#串接含有比例的輔助說明文字$legendStr=$legendStr."\"".$i."->".$conf["countNameArray"][$i]."(".$conf["ylabName"]."=".$conf["countArray"][$i].")\")";}#else end#如果要取消圖例if($conf["disableText"]=="true"){#如果 $conf["autoRadioByCountArray"] 等於 "true"if($conf["autoRadioByCountArray"]=="true"){#串接項目的名稱$labels=$labels."\"".$conf["countNameArray"][$i]."\r\n".$conf["ylabName"]."=".$conf["countArray"][$i]."(比例=".round($conf["countArray"][$i]/$totalCount,2).")\")";}#if end#反之不要比例資訊else{#串接項目的名稱$labels=$labels."\"".$conf["countNameArray"][$i]."\r\n".$conf["ylabName"]."=".$conf["countArray"][$i]."\")";}#else end}#if end#反之不要取消圖例else{#串接物件名稱,最後面加上)$labels=$labels."\"".$i."\")";}#else end}#else end}#for end#$conf["line"]=array();#$conf["line"][$i],一維字串陣列,代表要在圖上劃第$i+1條線的資訊#$conf["line"][$i]["startX"],整數,代表線條起始點的X軸坐標.#$conf["line"][$i]["startY"],整數,代表線條起始點的Y軸坐標.#$conf["line"][$i]["endX"],整數,代表線條終點的X軸坐標.#$conf["line"][$i]["endY"],整數,代表線條終點的Y軸坐標.#$conf["line"][$i]["color"],顏色,目前有black,green,red三種#初始化儲存劃線R語法陣列$line=array();#如果 $conf["line"] 有設定if(isset($conf["line"])){#有幾條線就執行幾次for($i=0;$i<count($conf["line"]);$i++){#設置線條的x軸啟起點與終點坐標$line[]="#設置線條的x軸啟起點與終點坐標";$line[]="xp=c(".$conf["line"][$i]["startX"].",".$conf["line"][$i]["endX"].")";#設置線條的y軸啟起點與終點坐標$line[]="#設置線條的y軸啟起點與終點坐標";$line[]="yp=c(".$conf["line"][$i]["startY"].",".$conf["line"][$i]["endY"].")";#判斷 $conf["line"][$i]["color"]switch($conf["line"][$i]["color"]){#如果是 "black"case "black":#劃線$line[]="#劃線";$line[]="lines(xp,yp)";#跳出 switchbreak;#如果是 "green"case "green":#劃綠色的線$line[]="#劃線綠色的線";$line[]="lines(xp,yp,col=3)";#跳出 switchbreak;#如果是 "red"case "red":#劃紅色的線$line[]="#劃線紅色的線";$line[]="lines(xp,yp,col=2)";#跳出 switchbreak;#如果是其他default:#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"][]="未知的顏色:".$conf["line"][$i]["color"];#回傳結果return $result;}#switch end}#for end}#if end#如果有設置圖片寬度if(isset($conf["picWidth"])){#設置圖片寬度的語法$conf["picWidth"]=",width=\"".$conf["picWidth"]."\"";}#if end#反之else{#不設置圖片寬度$conf["picWidth"]="";}#else end#如果有設置圖片寬度if(isset($conf["picHeight"])){#設置圖片寬度的語法$conf["picHeight"]=",Height=\"".$conf["picHeight"]."\"";}#if end#反之else{#不設置圖片寬度$conf["picHeight"]="";}#else end#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];$conf["R.writeRfile"]["addAndName"]=".R/barplot-".$_SESSION["username"].".R";#R檔案的位置與名稱$conf["R.writeRfile"]["textToWrite"][]="#barplot長條圖";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#欲繪出的資料頻率名稱";$conf["R.writeRfile"]["textToWrite"][]=$labels;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(timeLabel)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#欲繪出的輔助說明內容";$conf["R.writeRfile"]["textToWrite"][]=$legendStr;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(legendStr)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#要繪出的資料頻率";$conf["R.writeRfile"]["textToWrite"][]=$counts;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#設置圖片輸出的設定";$conf["R.writeRfile"]["textToWrite"][]="svg(filename=\"".$conf["imgFileName"]."\"".$conf["picWidth"].$conf["picHeight"].")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#長條圖的標題";$conf["R.writeRfile"]["textToWrite"][]="barplotMain=c(\"".$conf["barPlotTitle"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(barplotMain)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#x軸標題";$conf["R.writeRfile"]["textToWrite"][]="xlabStr=c(\"".$conf["xlabName"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(xlabStr)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#y軸標題";$conf["R.writeRfile"]["textToWrite"][]="ylabStr=c(\"".$conf["ylabName"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(ylabStr)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#繪製長條圖";$conf["R.writeRfile"]["textToWrite"][]="#頻率資料爲count";$conf["R.writeRfile"]["textToWrite"][]="#頻率名稱資料爲timeLabel";$conf["R.writeRfile"]["textToWrite"][]="#圖的標題爲 \"一年內的每月的分佈\"";$conf["R.writeRfile"]["textToWrite"][]="#x軸標題爲 xlabStr";$conf["R.writeRfile"]["textToWrite"][]="#y軸標題爲 ylabStr";$conf["R.writeRfile"]["textToWrite"][]="#註解文字為 legendStr";#如果要取消圖例if($conf["disableText"]=="true"){#產生沒有圖例的長條圖$conf["R.writeRfile"]["textToWrite"][]="barplot(count,names=timeLabel,main=barplotMain,xlab=xlabStr,ylab=ylabStr)";}#if end#反之代表不取消圖例else{#產生有圖例的長條圖$conf["R.writeRfile"]["textToWrite"][]="barplot(count,names=timeLabel,main=barplotMain,xlab=xlabStr,ylab=ylabStr,legend.text=legendStr)";}#else end$conf["R.writeRfile"]["textToWrite"][]="";#$line有幾個元素就執行幾次迴圈for($i=0;$i<count($line);$i++){#存入劃線的R語法$conf["R.writeRfile"]["textToWrite"][]=$line[$i];}#for end$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#關閉繪圖裝置";$conf["R.writeRfile"]["textToWrite"][]="dev.off()";#$conf["textToWrite"],要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];;$rScriptCreateResult=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#如果R腳本檔建立失敗if($rScriptCreateResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$rScriptCreateResult;#回傳結果return $result;}#if end#執行R腳本#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$rScriptCreateResult["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";$executeRresult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行R失敗if($executeRresult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$executeRresult;#回傳結果return $result;}#if end#檢查圖片檔案是否有產生#涵式說明:檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["varName"][$i],爲第$i個資料夾或檔案的名稱。#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填的參數:$conf["fileAccess.checkMultiFileExist"]["fileArray"]=array($conf["imgFileName"]);#要檢查書否存在的檔案有哪些,須爲一維陣列數值。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.checkMultiFileExist"]["fileArgu"]=$conf["fileArgu"];#參考資料來源:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php$fileCheckResult=fileAccess::checkMultiFileExist($conf["fileAccess.checkMultiFileExist"]);unset($conf["fileAccess.checkMultiFileExist"]);#如果要產生的圖片不存在if($fileCheckResult["varExist"][0]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$fileCheckResult;#回傳結果return $result;}#if end#取得圖片位置與名稱$result["img"]=$conf["imgFileName"];#函數說明:#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息#$result["content"],圖片的連結資訊#$result["function"],當前執行的函數名稱#必填參數:#$conf["img::data"]["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱$conf["img::data"]["imgPosition"]=$conf["imgFileName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["img::data"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["alt"],若沒有圖片要用什麼文字顯示。#$conf["alt"]="";#$conf["style"],字串陣列,要使用的style,key為樣式名稱,value為樣式值.$conf["img::data"]["style"]=array("width"=>"100%");#$conf["class"],圖片要套用的css樣式名稱.#$conf["class"]="";#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".$conf["img::data"]["mimeType"]="image/svg+xml";#$conf["compressType"],2元碼壓縮的方式,預設為"base64".#$conf["compressType"]="base64";#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".$conf["img::data"]["delImg"]=$conf["del"];#參考資料:#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php$data=img::data($conf["img::data"]);unset($conf["img::data"]);#如果顯示圖片失敗if($data["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$data;#回傳結果return $result;}#if end#取得顯示圖片的語法$result["content"]=$data["content"];#執行到這邊代表執行正常$result["status"]="true";#回傳結果return $result;}#function createBarPlot end/*#函式說明#繪製直方圖#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["img"],圖片的位置與名稱#$result["content"],放置圖片的語法#必填參數:#$conf["numArray"],字串陣列,要進行分組統計的原始資料$conf["numArray"]=array();#$conf["classCount"],字串,資料要分成幾組$conf["classCount"]="5";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["imgFileName"],字串,圖片存放的位置與名稱,預設爲 "hist-".$SESSION["username"]."svg"#$conf["imgFileName"]=".R/hist-".$SESSION["username"]."svg";#$conf["del"],字串,讀取完圖片之後是否要移除之,"ture"代表要,"false"代表不要,預設為"true"代表要.#$conf["del"]="";#$conf["histTitle"],字串,長條圖的標題,預設爲空。#$conf["histTitle"]="";#$conf["xlabName"],x軸的名稱,預設爲區間#$conf["xlabName"]="區間";#$conf["ylabName"],y軸的名稱,預設爲頻率#$conf["ylabName"]="頻率";#參考資料:#無.#備註:#無*/public static function createHist(&$conf=array()){#初始化要回傳的內容$result=array();#取得當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查必填的參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:$conf["variableCheck.isexistMulti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck.isexistMulti"]["variableCheck"]=array("numArray","fileArgu");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck.isexistMulti"]["variableType"]=array("array","string");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck.isexistMulti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck.isexistMulti"]);unset($conf["variableCheck.isexistMulti"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#檢查可省略的參數#函式說明:#檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。#必填參數:#$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?$conf["variableCheck.checkSkipableVarType"]["checkedVar"]=$conf;#$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.$conf["variableCheck.checkSkipableVarType"]["sikpableVarNameArray"]=array("imgFileName","del","histTitle","xlabName","ylabName");#$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何?$conf["variableCheck.checkSkipableVarType"]["skipableVarTypeArray"]=array("string","string","string","string","string");#$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).$argu=&$conf;#可省略參數:#$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"],字串陣列,每個不存的變數要初始化為什麼,"null"代表不指定.$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"]=array(".R/hist-".$_SESSION["username"].".svg","true"," ","區間","頻率");#無$checkResult=variableCheck::checkSkipableVarType($conf["variableCheck.checkSkipableVarType"],$argu);unset($conf["variableCheck.checkSkipableVarType"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#初始化 要進行統計的數字資料$numData="numData=c(";#有幾個比例陣列就執行幾次for($i=0;$i<count($conf["numArray"]);$i++){#如果不是最後一個比例if($i!=count($conf["numArray"])-1){#串接比例,結尾加逗號$numData=$numData.$conf["numArray"][$i].",";}#if end#反之是最後一個比例else{#串接比例,最後面加上)$numData=$numData.$conf["numArray"][$i].")";}#else end}#for end#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R.writeRfile"]["addAndName"]=".R/hist-".$_SESSION["username"].".R";#R檔案的位置與名稱$conf["R.writeRfile"]["textToWrite"][]="#hist直方圖";$conf["R.writeRfile"]["textToWrite"][]="#將原始數字向量進行分組";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#要分組的資料內容";$conf["R.writeRfile"]["textToWrite"][]=$numData;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#設置圖片輸出的設定";$conf["R.writeRfile"]["textToWrite"][]="svg(filename=\"".$conf["imgFileName"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#直方圖的標題";$conf["R.writeRfile"]["textToWrite"][]="histMain=c(\"".$conf["histTitle"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(histMain)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#x軸標題";$conf["R.writeRfile"]["textToWrite"][]="xlabStr=c(\"".$conf["xlabName"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(xlabStr)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#y軸標題";$conf["R.writeRfile"]["textToWrite"][]="ylabStr=c(\"".$conf["ylabName"]."\")";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#改用UTF-8去讀";$conf["R.writeRfile"]["textToWrite"][]="Encoding(ylabStr)<-\"UTF-8\"";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#繪製直方圖";$conf["R.writeRfile"]["textToWrite"][]="#要分組的資料爲numData";$conf["R.writeRfile"]["textToWrite"][]="#圖的標題爲 \"一年內的每月的分佈\"";$conf["R.writeRfile"]["textToWrite"][]="#x軸標題爲 \"出現月份\"";$conf["R.writeRfile"]["textToWrite"][]="#y軸標題爲 \"出現頻率\"";$conf["R.writeRfile"]["textToWrite"][]="hist(numData,nclass=".$conf["classCount"].",main=histMain,xlab=xlabStr,ylab=ylabStr)";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#關閉繪圖裝置";$conf["R.writeRfile"]["textToWrite"][]="dev.off()";#$conf["textToWrite"],要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];$rScriptCreateResult=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#如果R腳本檔建立失敗if($rScriptCreateResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$rScriptCreateResult;#回傳結果return $result;}#if end#執行R腳本#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$rScriptCreateResult["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";$executeRresult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行R失敗if($executeRresult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$executeRresult;#回傳結果return $result;}#if end#檢查圖片檔案是否有產生#涵式說明:檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["varName"][$i],爲第$i個資料夾或檔案的名稱。#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填的參數:$conf["fileAccess.checkMultiFileExist"]["fileArray"]=array($conf["imgFileName"]);#要檢查書否存在的檔案有哪些,須爲一維陣列數值。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.checkMultiFileExist"]["fileArgu"]=$conf["fileArgu"];#參考資料來源:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php$fileCheckResult=fileAccess::checkMultiFileExist($conf["fileAccess.checkMultiFileExist"]);unset($conf["fileAccess.checkMultiFileExist"]);#如果要產生的圖片不存在if($fileCheckResult["varExist"][0]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$fileCheckResult;#回傳結果return $result;}#if end#取得圖片位置與名稱$result["img"]=$conf["imgFileName"];#函數說明:#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息#$result["content"],圖片的連結資訊#$result["function"],當前執行的函數名稱#必填參數:#$conf["img::data"]["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱$conf["img::data"]["imgPosition"]=$conf["imgFileName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["img::data"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["alt"],若沒有圖片要用什麼文字顯示。#$conf["alt"]="";#$conf["style"],字串陣列,要使用的style,key為樣式名稱,value為樣式值.$conf["img::data"]["style"]=array("width"=>"100%");#$conf["class"],圖片要套用的css樣式名稱.#$conf["class"]="";#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".$conf["img::data"]["mimeType"]="image/svg+xml";#$conf["compressType"],2元碼壓縮的方式,預設為"base64".#$conf["compressType"]="base64";#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".$conf["img::data"]["delImg"]=$conf["del"];#參考資料:#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php$data=img::data($conf["img::data"]);unset($conf["img::data"]);#如果顯示圖片失敗if($data["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$data;#回傳結果return $result;}#if end#取得顯示圖片的語法$result["content"]=$data["content"];#執行到這邊代表執行正常$result["status"]="true";#回傳結果return $result;}#function createHist end/*#函式說明:#運用apriori進行關聯分析,用來分析多個名目變數選項組合預測某個行爲的,支持度,信度,解釋力,分析結果會排除其中一個條件或結果變數爲空值者。#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["oriOutPut"],R原始的分析結果輸出#$result["content"],分析結果#$result["content"]["rulesCount"],記錄總共有幾筆關聯規則#$result["content"]["rulesArray"],規則的內容#$result["content"]["rulesArray"][$i],代表第$i+1個規則的內容陣列#$result["content"]["rulesArray"][$i]["lhsName"][$j],表第$i+1個規則的第$j+1個條件的名稱#$result["content"]["rulesArray"][$i]["lhsValue"][$j],表第$i+1個規則的第$j+1個條件名稱對應的數值內容#$result["content"]["rulesArray"][$i]["rhsName"][$j],表第$i+1個規則的第$j+1個結果的名稱#$result["content"]["rulesArray"][$i]["rhsValue"][$j],表第$i+1個規則的第$j+1個結果名稱對應的數值內容#$result["content"]["rulesArray"][$i]["support"],表示$i+1個規則的support值#$result["content"]["rulesArray"][$i]["confidence"],表示$i+1個規則的support值#$result["content"]["rulesArray"][$i]["lift"],表示$i+1個規則的support值#必填參數:#$conf["csvFile"],字串,要讀取的csv檔位置與名稱,欄位數量必須大於2欄.$conf["csvFile"]="";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["forecastVarName"],字串,指定多個要預測變數名稱,預設不指定.#$conf["forecastVarName"]="";#$conf["forecastVarValueArray"],字串陣列,指定預測的變數要等於哪些數值,預設不指定,若指定則至少要有兩個元素.#$conf["forecastVarValueArray"]=array();#$conf["support"],字串,支持度要多少,ex:"0.05".#$conf["support"]="";#$conf["confidence"],字串,信度要多少,ex:"0.8".#$conf["confidence"]="";#參考資料:#無.#備註:#無*/public static function apriori(&$conf){#初始化要回傳的內容$result=array();#取得當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查必填參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:$conf["variableCheck.isexistMulti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck.isexistMulti"]["variableCheck"]=array("csvFile","fileArgu");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck.isexistMulti"]["variableType"]=array("string","string");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck.isexistMulti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck.isexistMulti"]);unset($conf["variableCheck.isexistMulti"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#檢查可省略的參數#函式說明:#檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。#必填參數:#$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?$conf["variableCheck.checkSkipableVarType"]["checkedVar"]=$conf;#$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.$conf["variableCheck.checkSkipableVarType"]["sikpableVarNameArray"]=array("forecastVarName","forecastVarValueArray","support","confidence","lift");#$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何?$conf["variableCheck.checkSkipableVarType"]["skipableVarTypeArray"]=array("string","array","string","string","string");#$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).$argu=&$conf;#可省略參數:#$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"],字串陣列,每個不存的變數要初始化為什麼,"null"代表不指定.#$conf["variableCheck.checkSkipableVarType"]["skipableVarDefaultValue"]=array(".R/hist-".$_SESSION["username"].".png"," ","區間","頻率");#無$checkResult=variableCheck::checkSkipableVarType($conf["variableCheck.checkSkipableVarType"],$argu);unset($conf["variableCheck.checkSkipableVarType"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#讀取csv檔標題欄位的內容#涵式說明:#讀取csv檔案的內容#回傳得結果:#$result["status"],執行是否正常,"true"代表正常;"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["content"],csv檔案內容的陣列#$result["content"]["$i"]["$j"]代表第$i+1列第$j+1欄位的內容.#如果 $conf["firstLineVarName"]爲"true"的話則會多回傳 $result["content"]["第幾列"]["第一列各個欄位的名稱"]#$result["title"],欄位的名稱#$result["lineCount"],總共幾列資料#必填的參數:$conf["csv.read"]["csvFilePositionAndName"]=$conf["csvFile"];#csv檔案的位置#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["csv.read"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:$conf["csv.read"]["firstLineVarName"]="true";#第一行是否爲變數名稱(各個欄位的名稱)#參考資料來源:#http://www.php.net/manual/en/function.str-split.php#參考資料來源#http://php.net/manual/en/function.fgetcsv.php$readCsvResult=csv::read($conf["csv.read"]);unset($conf["csv.read"]);#如果讀取csv檔,失敗if($readCsvResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$readCsvResult;#回傳結果return $result;}#if end#如果欄位數量沒有大於2if(count($readCsvResult["title"])<=2){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]="csv檔案的欄位數量須大於2";#回傳結果return $result;}#if end#取得標題欄位的內容$columnTitle=$readCsvResult["title"];#初始化更新標題欄位的R語法$updateColumnsNameStr="colnames(data)<-c(";#執行 $columnTitle 的數量次數回圈for($i=0;$i<count($columnTitle);$i++){#如果不是最後一個標題if($i!=count($columnTitle)-1){#串接標題名稱與逗號$updateColumnsNameStr=$updateColumnsNameStr."\"".$columnTitle[$i]."\",";}#if end#反之爲最後一個標題else{#串接標題名稱與「)」$updateColumnsNameStr=$updateColumnsNameStr."\"".$columnTitle[$i]."\")";}#else end}#for end#初始化要寫入到R腳本的逐行內容$dataToWrite=array();#設置要寫到R腳本的資料$dataToWrite[]="#資料探堪-關聯分析-apriori";$dataToWrite[]="";$dataToWrite[]="#匯入 arules 套件";$dataToWrite[]="library(arules)";$dataToWrite[]="";$dataToWrite[]="#讀取資料檔";$dataToWrite[]="data=read.csv(\"".$conf["csvFile"]."\")";$dataToWrite[]="";$dataToWrite[]="#更新欄位變數內容";$dataToWrite[]=$updateColumnsNameStr;$dataToWrite[]="";#初始化 aprior 的 param 字串$parameter="parameter=list(minlen=2";#如果存在 $conf["support"]if(isset($conf["support"])){#設置最低支持度$parameter=$parameter.",support=".$conf["support"];}#if end#如果存在 $conf["confidence"]if(isset($conf["confidence"])){#設置最低信度$parameter=$parameter.",confidence=".$conf["confidence"];}#if end#結束 param 字串$parameter=$parameter.")";#如果有指定預測結果的變數與其數值內容if(isset($conf["forecastVarName"]) && isset($conf["forecastVarValueArray"])){#如果 $conf["forecastVarValueArray"] 的元素數量小於 2if(count($conf["forecastVarValueArray"])<2){#設置執行錯誤$result["status"]="false";#設置執行錯誤訊息$result["error"][]="變數 \"forecastVarValueArray\"(apriori的RHS)至少需要兩個項目";#回傳結果return $result;}#if end#建立皆為 $conf["forecastVarName"] 的陣列#函式說明:#建立一個陣列,可以指派陣列的內容,然後回傳#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息陣列.#$result["content"],爲陣列變數內容#必填的參數:$conf["arrays::create"]["arrayContent"]=array($conf["forecastVarName"]);#陣列元素的內容,須爲陣列值。#可省略的參數:$conf["arrays::create"]["arrayCounts"]=count($conf["forecastVarValueArray"]);#爲陣列的元素有幾個,若沒設定,則數量爲$conf["arrayContent"]裏的元素數量$conf["arrays::create"]["theSameAs"]="true";#若設爲"true",則所有元素內容都跟第一個元素內容相同$forecastVarNameArray=arrays::create($conf["arrays::create"]);unset($conf["arrays::create"]);#如果建立 皆為 $conf["forecastVarName"] 的陣列失敗if($forecastVarNameArray["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$forecastVarNameArray;#回傳結果return $result;}#if end#建立皆為 「=」 的陣列#函式說明:#建立一個陣列,可以指派陣列的內容,然後回傳#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息陣列.#$result["content"],爲陣列變數內容#必填的參數:$conf["arrays::create"]["arrayContent"]=array("=");#陣列元素的內容,須爲陣列值。#可省略的參數:$conf["arrays::create"]["arrayCounts"]=count($conf["forecastVarValueArray"]);#爲陣列的元素有幾個,若沒設定,則數量爲$conf["arrayContent"]裏的元素數量$conf["arrays::create"]["theSameAs"]="true";#若設爲"true",則所有元素內容都跟第一個元素內容相同$equalArray=arrays::create($conf["arrays::create"]);unset($conf["arrays::create"]);#如果建立 皆為「=」的陣列失敗if($equalArray["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$equalArray;#回傳結果return $result;}#if end#將 指定預測結果的變數與其數值內容 合併成一維陣列#函式說明:#透過多個擁有一樣數量元素的一維陣列,透過指定的連接字串,組成一組同樣數量的一維陣列。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常。#$result["error"],錯誤訊息。#$result["content"],組合成新值的一維陣列。#$result["function"],當前執行的函數名稱。#必填參數:#$conf["R::combineToNewArray"]["arrays"],二維陣列,爲要依序由哪些陣列變數來進行組合$conf["R::combineToNewArray"]["arrays"]=array($forecastVarNameArray["content"],$conf["forecastVarValueArray"]);#可省略參數:#$conf["R::combineToNewArray"]["combineSymbolArray"],陣列字串,數量爲$conf["arrays"]減一,爲用於連結各一維陣列變數的連接字串,預設皆爲"<=>"。$conf["R::combineToNewArray"]["combineSymbolArray"]=$equalArray["content"];$combineToNewArray=arrays::combineToNewArray($conf["R::combineToNewArray"]);unset($conf["R::combineToNewArray"]);#如果合併兩個一維陣列失敗if($combineToNewArray["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$combineToNewArray;#回傳結果return $result;}#if end#組裝 $conf["forecastVarNameArray"] 與 $conf["forecastVarValueArray"] 為 $appearance#涵式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#$result["lineCount"],用了幾列程式完成向量變數的建立#必填參數:#$conf["R::createFixedVectorVar"]["vectorName"],字串,向量變數在R裡面的名稱。$conf["R::createFixedVectorVar"]["vectorName"]="rhsCondition";#$conf["R::createFixedVectorVar"]["vectorData"],陣列變數,要產生的向量變數資料。$conf["R::createFixedVectorVar"]["vectorData"]=$combineToNewArray["content"];#$conf["R::createFixedVectorVar"]["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["R::createFixedVectorVar"]["writeTarget"]=&$dataToWrite;$createFixedVectorVar=R::createFixedVectorVar($conf["R::createFixedVectorVar"]);unset($conf["R::createFixedVectorVar"]);#如果建立向量變數失敗if($createFixedVectorVar["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$createFixedVectorVar;#回傳結果return $result;}#if end$dataToWrite[]="#使用 apriori 對data進行資料探堪 並將所有規則存在 rules";$dataToWrite[]="#control = list(verbose=F)代表不顯示一些過程資訊";$dataToWrite[]="#parameter = list(minlen=2)代表P(A)與P(B)不能爲空集合";$dataToWrite[]="#appearance = list(rhs=c(\"Survived=No\", \"Survived=Yes\"),default=\"lhs\")代表結果變數Survived必須為\"No\"或 \"Yes\",原因變數不限定.";$dataToWrite[]="rules<-apriori(data,control = list(verbose=F),".$parameter.",appearance=list(rhs=rhsCondition,default=\"lhs\"))";}#if end#反之沒有指定else{$dataToWrite[]="#使用 apriori 對data進行資料探堪 並將所有規則存在 rules";$dataToWrite[]="#control = list(verbose=F)代表不顯示一些過程資訊";$dataToWrite[]="#parameter = list(minlen=2)代表P(A)與P(B)不能爲空集合";$dataToWrite[]="rules<-apriori(data,control = list(verbose=F),".$parameter.")";}#else end$dataToWrite[]="";$dataToWrite[]="#檢示總共找到幾條規則rules";$dataToWrite[]="rules";$dataToWrite[]="";$dataToWrite[]="#設定規則的 support confidence lift 比例到小數點後三位就好";$dataToWrite[]="quality(rules)<-round(quality(rules),digits=3)";$dataToWrite[]="";$dataToWrite[]="#排序規則的順序,用lift來排,預設爲遞減排序。";$dataToWrite[]="rules.sorted<-sort(rules,by=\"lift\")";$dataToWrite[]="";$dataToWrite[]="#檢示所有規則的資料";$dataToWrite[]="inspect(rules.sorted)";#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:if(!isset($_SESSION)){$conf["R.writeRfile"]["addAndName"]=".R/".$_SERVER["USER"]."-apriori.R";#R檔案的位置與名稱}else if(isset($_SESSION["username"])){$conf["R.writeRfile"]["addAndName"]=".R/".$_SESSION["username"]."-apriori.R";#R檔案的位置與名稱}else{#取得系統時間$unixTime=time::getMicrotime();$conf["R.writeRfile"]["addAndName"]=".R/".$unixTime."-apriori.R";#R檔案的位置與名稱}$conf["R.writeRfile"]["textToWrite"]=$dataToWrite;#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];$writeRfileResult=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#移除暫存的R腳本內容變數unset($dataToWrite);#如果 R 腳本寫入失敗if($writeRfileResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$writeRfileResult;#回傳結果return $result;}#if end#取得R腳本的位置$rScriptAdd=$writeRfileResult["newCreatedRfilePathAndName"];#執行R腳本#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["R.executeR"]["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$rScriptAdd;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["R.executeR"]["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["R.executeR"]["disbaleOptimal"]="true";$executeResult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行R腳本出錯if($executeResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$executeResult;#回傳結果return $result;}#if end#取得執行R後的輸出$result["oriOutPut"]=$executeResult;#初始化記錄規則的陣列變數$rulesArray=array();#初始化儲存規則計數的數字$rulesNum=0;#初始化暫存lhs條件的陣列變數$lhsNameArrays=array();$lhsValueArrays=array();#初始化分析資料的列是從第幾列開始$rulesLineStart=28;#如果有指定預測結果的變數與其數值內容if(isset($conf["forecastVarName"]) && isset($conf["forecastVarValueArray"])){#設置分析資料的列是從第31列開始$rulesLineStart=$rulesLineStart+$createFixedVectorVar["lineCount"]+1;}#if end#依據每行的輸出結果for($i=$rulesLineStart;$i<$executeResult["lineCount"]-1;$i++){#如果分析資料的開始列為 "NULL"if($executeResult["lineArray"][$rulesLineStart]=="NULL"){#設置執行正常$result["status"]="true";#取得規則內容$result["content"]["rulesArray"]=array();#設置規則筆數$result["content"]["rulesCount"]=0;#回傳結果return $result;}#if end#用空格區分,看第一個是否為關聯規則的筆數.#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前執行的函數名稱.#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeResult["lineArray"][$i];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果分割好的第一段是 ($rulesNum+1) 則代表新的規則開始if($spiltString["dataArray"][0]==$rulesNum+1){#規則加1$rulesNum++;}#if end#如果有讀到 「=>」 則代表是當前規則的結束#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search.findKeyWord"]["keyWord"]="=>";#想要搜尋的關鍵字$conf["search.findKeyWord"]["string"]=$executeResult["lineArray"][$i];#要被搜尋的字串內容#可省略的參數:#$conf["search.findKeyWord"]["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$searchResult=search::findKeyWord($conf["search.findKeyWord"]);unset($conf["search.findKeyWord"]);#如果 $searchResult["status"] 等於 "false"if($searchResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$searchResult;#回傳結果return $result;}#if end#如果有找到關鍵字if($searchResult["founded"]=="true"){#解析原因與導致的結果字串#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$executeResult["lineArray"][$i];#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]="=>";#爲以哪個符號作爲分割$rulesStr=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果處理結果字串出錯if($rulesStr["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$rulesStr;#回傳結果return $result;}#if end#取得原因字串$factorStr=$rulesStr["dataArray"][0];#取得結果字串$resultStr=$rulesStr["dataArray"][1];#解析原因字串的變數名稱與其數值#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$factorStr;#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]="=";#爲以哪個符號作爲分割$factorStr=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果處理結果字串出錯if($factorStr["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$factorStr;#回傳結果return $result;}#if end#剔除原因字串中不需要的字#涵式說明:#處理多個字串避免網頁出錯#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["processedStrArray"],處理好的字串陣列#必填的參數:$conf["stringProcess::correctMutiStrCharacter"]["stringIn"]=array($factorStr["dataArray"][0],$factorStr["dataArray"][1]);#爲要處理的字串陣列#可省略的參數:$conf["stringProcess::correctMutiStrCharacter"]["selectedCharacter"]=array($rulesNum,"{","}",".",",",";"," ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">",";","=","//","'","$","%","&","|","/*","*\/","#")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔#$conf["changeTo"]=array();#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$factorStr=stringProcess::correctMutiStrCharacter($conf["stringProcess::correctMutiStrCharacter"]);unset($conf["stringProcess::correctMutiStrCharacter"]);#如果處理結果字串出錯if($factorStr["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$factorStr;#回傳結果return $result;}#if end#取得導致的原因$rulesArray[$rulesNum]["lhsName"][]=$factorStr["processedStrArray"][0];$rulesArray[$rulesNum]["lhsValue"][]=$factorStr["processedStrArray"][1];#解析結果字串的變數名稱與其數值#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$resultStr;#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]="=";#爲以哪個符號作爲分割$resultStr=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果處理結果字串出錯if($resultStr["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$resultStr;#回傳結果return $result;}#if end#涵式說明:#處理多個字串避免網頁出錯#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["processedStrArray"],處理好的字串陣列#必填的參數:$conf["stringProcess::correctMutiStrCharacter"]["stringIn"]=array($resultStr["dataArray"][0]);#爲要處理的字串陣列#可省略的參數:$conf["stringProcess::correctMutiStrCharacter"]["selectedCharacter"]=array("{","}",";"," ",".");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">",";","=","//","'","$","%","&","|","/*","*\/","#")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔#$conf["changeTo"]=array();#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$resultName=stringProcess::correctMutiStrCharacter($conf["stringProcess::correctMutiStrCharacter"]);unset($conf["stringProcess::correctMutiStrCharacter"]);#如果處理結果字串出錯if($resultName["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$resultName;#回傳結果return $result;}#if end#取得導致的結果名稱$rulesArray[$rulesNum]["rhsName"][]=$resultName["processedStrArray"][0];#取得導致的結果名稱對應的內容與其相關數值$resultValueAndOthers=$resultStr["dataArray"][1];#解析導致的結果名稱對應的內容與其相關數值#涵式說明:#處理多個字串避免網頁出錯#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["processedStrArray"],處理好的字串陣列#必填的參數:$conf["stringProcess::correctMutiStrCharacter"]["stringIn"]=array($resultValueAndOthers);#爲要處理的字串陣列#可省略的參數:$conf["stringProcess::correctMutiStrCharacter"]["selectedCharacter"]=array("{","}",";");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">",";","=","//","'","$","%","&","|","/*","*\/","#")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔#$conf["changeTo"]=array();#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$resultValueAndOthers=stringProcess::correctMutiStrCharacter($conf["stringProcess::correctMutiStrCharacter"]);unset($conf["stringProcess::correctMutiStrCharacter"]);#如果處理結果字串出錯if($resultValueAndOthers["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$resultValueAndOthers;#回傳結果return $result;}#if end#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$resultValueAndOthers["processedStrArray"][0];#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割$resultValue=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果處理結果字串出錯if($resultValue["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$resultValue;#回傳結果return $result;}#if end#取得導致的結果名稱對應的數值$rulesArray[$rulesNum]["rhsValue"][]=$resultValue["dataArray"][0];#取得導致結果名稱對應數值的 support$rulesArray[$rulesNum]["support"][]=$resultValue["dataArray"][1];#取得導致結果名稱對應數值的 confidence$rulesArray[$rulesNum]["confidence"][]=$resultValue["dataArray"][2];#取得導致結果名稱對應數值的 lift$rulesArray[$rulesNum]["lift"][]=$resultValue["dataArray"][3];}#if end#反之沒有找到關鍵字else{#取得該行結果$thisLine=$executeResult["lineArray"][$i];#涵式說明:#處理多個字串避免網頁出錯#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["function"],當前執行的函數.#$result["error"],錯誤訊息#$result["processedStrArray"],處理好的字串陣列#必填的參數:$conf["stringProcess::correctMutiStrCharacter"]["stringIn"]=array($thisLine);#爲要處理的字串陣列#可省略的參數:$conf["stringProcess::correctMutiStrCharacter"]["selectedCharacter"]=array(" ","{","}",";",".",","," ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">",";","=","//","'","$","%","&","|","/*","*\/","#")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔#$conf["changeTo"]=array();#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$thisLine=stringProcess::correctMutiStrCharacter($conf["stringProcess::correctMutiStrCharacter"]);unset($conf["stringProcess::correctMutiStrCharacter"]);#如果處理結果字串出錯if($thisLine["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$thisLine;#回傳結果return $result;}#if end#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前執行的函數名稱.#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$thisLine["processedStrArray"][0];#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]="=";#爲以哪個符號作爲分割$conditionStr=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果處理結果字串出錯if($conditionStr["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$conditionStr;#回傳結果return $result;}#if end#將導致的原因變數名稱前的規則號碼剔除#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess::correctCharacter"]["stringIn"]=$conditionStr["dataArray"][0];#爲要處理的字串#可省略的參數:$conf["stringProcess::correctCharacter"]["selectedCharacter"]=array($rulesNum);#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔#$conf["changeTo"]=array();#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$correctCharacter=stringProcess::correctCharacter($conf["stringProcess::correctCharacter"]);unset($conf["stringProcess::correctCharacter"]);#如果修正出錯if($correctCharacter["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$correctCharacter;#回傳結果return $result;}#if end#取得處理好的導致的原因變數名稱$rulesArray[$rulesNum]["lhsName"][]=$correctCharacter["content"];#如果 $conditionStr["dataArray"][1] 不存在if(!isset($conditionStr["dataArray"][1])){#設爲 ""$conditionStr["dataArray"][1]="";}#if end#取得導致的原因變數名稱其值爲何$rulesArray[$rulesNum]["lhsValue"][]=$conditionStr["dataArray"][1];}#else end}#for end#取得規則內容$result["content"]["rulesArray"]=$rulesArray;#取得規則的數量$result["content"]["rulesCount"]=count($rulesArray);#設置執行正常$result["status"]="true";#回傳結果return $result;}#funciton apriori end/*#函式說明:#繪製樣本中其中兩個題項填寫狀況的交叉表#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["RscriptContent"],執行的R腳本內容#$result["content"],交叉表的資料#$result["content"]["xLabelTypeName"],欄項目的類型名稱#$result["content"]["yLabelTypeName"],列項目的類型名稱#$result["content"]["xLabelName"],欄項目名稱陣列#$result["content"]["yLabelName"],列項目名稱陣列#$result["content"][$i]["xLabelName"],交叉表從上致下,從左至右第$i+1個數值的x軸項目名稱.#$result["content"][$i]["yLabelName"],交叉表從上致下,從左至右第$i+1個數值的y軸項目名稱.#$result["content"][$i]["value"],交叉表從上致下,從左至右第$i+1個數值.#$result["content"]["htmlAddress"],交叉表html檔案的位址與檔案名稱.#必填參數:#$conf["dnnStr"],字串陣列,每個資料集的名稱$conf["dnnStr"]=array("","","");#$conf["dataArrayA"],字串陣列,要繪製交叉表的資料A,元素數量必須跟$conf["dataArrayB"]一樣。$conf["dataArrayA"]=array();#$conf["dataArrayB"],字串陣列,要繪製交叉表的資料B,元素數量必須跟$conf["dataArrayA"]一樣。$conf["dataArrayB"]=array();#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["dataArrayC"],字串陣列,要繪製交叉表的資料C(有幾種資料就會產生幾張交叉表)#$conf["dataArrayC"]=array();#$conf["crossTableAddress"],字串,產生好的crossTable網頁檔要存在哪裡,名稱為何,副檔名(.html)會自動補上,不設定的話,就不會產生html檔.#$conf["crossTableAddress"]="";#參考資料:#無.#備註:#無*/public static function table(&$conf){#初始化要回傳的結果$result=array();#如果 $conf 不等於 "array"if(gettype($conf)!="array"){#設定錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]="參數的Key指定有誤!";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#如果 $_SESSION["username"] 不存在if(!isset($_SESSION["username"])){#設為"NULL"$_SESSION["username"]="NULL";}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:#$conf["variableCheck.checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck.checkArguments"]["varInput"]=&$conf;#$conf["variableCheck.checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck.checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","dnnStr","dataArrayA","dataArrayB");#$conf["variableCheck.checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");$conf["variableCheck.checkArguments"]["mustBeFilledVariableType"]=array("string","array","array","array");#$conf["variableCheck.checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck.checkArguments"]["referenceVarKey"]="variableCheck.checkArguments";#可以省略的參數:#$conf["variableCheck.checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"false"。$conf["variableCheck.checkArguments"]["canBeEmptyString"]="false";#$conf["variableCheck.checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck.checkArguments"]["skipableVariableName"]=array("dataArrayC","crossTableAddress");#$conf["variableCheck.checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck.checkArguments"]["skipableVariableType"]=array("array","string");#$conf["variableCheck.checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,"null"代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck.checkArguments"]["skipableVarDefaultValue"]=array(null,".R/table-".$_SESSION["username"].".html");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.$conf["variableCheck.checkArguments"]["arrayCountEqualCheck"][]=array("dataArrayA","dataArrayB","dataArrayC");$checkArgumentsResult=variableCheck::checkArguments($conf["variableCheck.checkArguments"]);unset($conf["variableCheck.checkArguments"]);#如果檢查參數失敗if($checkArgumentsResult["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkArgumentsResult;#回傳結果return $result;}#if end#如果參數檢查不通過if($checkArgumentsResult["passed"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkArgumentsResult;#回傳結果return $result;}#if end#初始化儲存資料集C的字串變數$dataArrayC="";#產生用於產生交叉表的R語法#初始化儲存資料集名稱的變數$dnnStr="c(";#如果 $dataArrayC 等於 ""if($dataArrayC==""){#串接兩個資料集名稱$dnnStr=$dnnStr."\"".$conf["dnnStr"][0]."\","."\"".$conf["dnnStr"][1]."\")";#產生用於產生交叉表的R語法$table="table(dataA,dataB,dnn=dnnStr)";}#if end#反之else{#串接三個資料集名稱$dnnStr=$dnnStr."\"".$conf["dnnStr"][0]."\","."\"".$conf["dnnStr"][1]."\""."\","."\"".$conf["dnnStr"][2]."\")";$table="table(dataA,dataB,dataC,dnn=dnnStr)";}#else end#取得欄項目的類型名稱$result["content"]["xLabelTypeName"]=$conf["dnnStr"][1];#取得列項目的類型名稱$result["content"]["yLabelTypeName"]=$conf["dnnStr"][0];#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R.writeRfile"]["addAndName"]=".R/table-".$_SESSION["username"].".R";#R檔案的位置與名稱#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。$conf["R.writeRfile"]["textToWrite"][]="#產生交叉表的R腳本";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#資料集描述";$conf["R.writeRfile"]["textToWrite"][]="dnnStr=".$dnnStr;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#資料集A(會稱呈現在Y軸)";#建立資料集A#涵式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 __vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#必填參數:#$conf["R::createFixedVectorVar"]["vectorName"],字串,向量變數在R裡面的名稱。$conf["R::createFixedVectorVar"]["vectorName"]="dataA";#$conf["R::createFixedVectorVar"]["vectorData"],陣列變數,要產生的向量變數資料。$conf["R::createFixedVectorVar"]["vectorData"]=$conf["dataArrayA"];#$conf["R::createFixedVectorVar"]["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["R::createFixedVectorVar"]["writeTarget"]=&$conf["R.writeRfile"]["textToWrite"];$createFixedVectorVar=R::createFixedVectorVar($conf["R::createFixedVectorVar"]);unset($conf["R::createFixedVectorVar"]);#如果新增建立R向量變數失敗if($createFixedVectorVar["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$createFixedVectorVar;#回傳結果return $result;}#if end$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#資料集B(會稱呈現在X軸)";#建立資料集B#涵式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 __vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#必填參數:#$conf["R::createFixedVectorVar"]["vectorName"],字串,向量變數在R裡面的名稱。$conf["R::createFixedVectorVar"]["vectorName"]="dataB";#$conf["R::createFixedVectorVar"]["vectorData"],陣列變數,要產生的向量變數資料。$conf["R::createFixedVectorVar"]["vectorData"]=$conf["dataArrayB"];#$conf["R::createFixedVectorVar"]["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["R::createFixedVectorVar"]["writeTarget"]=&$conf["R.writeRfile"]["textToWrite"];$createFixedVectorVar=R::createFixedVectorVar($conf["R::createFixedVectorVar"]);unset($conf["R::createFixedVectorVar"]);#如果新增建立R向量變數失敗if($createFixedVectorVar["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$createFixedVectorVar;#回傳結果return $result;}#if end$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#第三個資料集,有幾種資料就會繪製幾個交叉表";#如果 $conf["dataArrayC"] 存在if(isset($conf["dataArrayC"])){#如果 $conf["dataArrayC"] 不為 ""if($conf["dataArrayC"]!=""){#建立資料集C#涵式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 __vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#必填參數:#$conf["R::createFixedVectorVar"]["vectorName"],字串,向量變數在R裡面的名稱。$conf["R::createFixedVectorVar"]["vectorName"]="dataC";#$conf["R::createFixedVectorVar"]["vectorData"],陣列變數,要產生的向量變數資料。$conf["R::createFixedVectorVar"]["vectorData"]=$conf["dataArrayC"];#$conf["R::createFixedVectorVar"]["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["R::createFixedVectorVar"]["writeTarget"]=&$conf["R.writeRfile"]["textToWrite"];$createFixedVectorVar=R::createFixedVectorVar($conf["R::createFixedVectorVar"]);unset($conf["R::createFixedVectorVar"]);#如果新增建立R向量變數失敗if($createFixedVectorVar["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$createFixedVectorVar;#回傳結果return $result;}#if end}#if end}#if end$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#產生交叉表";$conf["R.writeRfile"]["textToWrite"][]="data.table=".$table;$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#輸出列的項目名稱";$conf["R.writeRfile"]["textToWrite"][]="cat(rownames(data.table),file=\".R/table-".$_SESSION["username"]."-R-CatOutput\",append=FALSE)";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#輸出換行符號附加到 .R/table-".$_SESSION["username"]."-R-CatOutput";$conf["R.writeRfile"]["textToWrite"][]="cat(\"\r\n\",file=\".R/table-".$_SESSION["username"]."-R-CatOutput\",append=TRUE)";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#印出欄的項目名稱";$conf["R.writeRfile"]["textToWrite"][]="cat(colnames(data.table),file=\".R/table-".$_SESSION["username"]."-R-CatOutput\",append=TRUE)";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#輸出換行符號附加到 .R/table-".$_SESSION["username"]."-R-CatOutput";$conf["R.writeRfile"]["textToWrite"][]="cat(\"\r\n\",file=\".R/table-".$_SESSION["username"]."-R-CatOutput\",append=TRUE)";$conf["R.writeRfile"]["textToWrite"][]="";$conf["R.writeRfile"]["textToWrite"][]="#印出交叉表";$conf["R.writeRfile"]["textToWrite"][]="cat(data.table,file=\".R/table-".$_SESSION["username"]."-R-CatOutput\",append=TRUE)";$conf["R.writeRfile"]["textToWrite"][]="";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.writeRfile"]["fileArgu"]=$conf["fileArgu"];$writeRfile=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#如果R腳本檔建立失敗if($writeRfile["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$writeRfile;#回傳結果return $result;}#if end#執行R腳本檔#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#$result["RscriptContent"],執行的R腳本內容.#必填的參數:#$conf["R.executeR"]["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$writeRfile["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R.executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["R.executeR"]["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["R.executeR"]["disbaleOptimal"]="true";$executeRresult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行R腳本失敗if($executeRresult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$executeRresult;#回傳結果return $result;}#if end#檢查 ".R/table-".$_SESSION["username"]."-R-CatOutput" 是否存在#涵式說明:檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["varName"][$i],爲第$i個資料夾或檔案的名稱。#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填的參數:$conf["fileAccess.checkMultiFileExist"]["fileArray"]=array(".R/table-".$_SESSION["username"]."-R-CatOutput");#要檢查書否存在的檔案有哪些,須爲一維陣列數值。#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.checkMultiFileExist"]["fileArgu"]=$conf["fileArgu"];#參考資料來源:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["fileAccess.checkMultiFileExist"]);unset($conf["fileAccess.checkMultiFileExist"]);#如果 ".R/table-".$_SESSION["username"]."-R-CatOutput" 不存在if($checkMultiFileExist["varExist"][0]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$checkMultiFileExist;#回傳結果return $result;}#if end#讀取 ".R/table-".$_SESSION["username"]."-R-CatOutput" 檔案的內容以便存取列與欄的項目名稱.#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗。#$result["error"],錯誤訊息提示#$result["fileContent"],爲檔案的內容陣列#$result["lineCount"],爲檔案內容總共的行數#$result["fullContent"],為檔案的完整內容#必填的參數:$conf["fileAccess.getFileContent"]["filePositionAndName"]=".R/table-".$_SESSION["username"]."-R-CatOutput";#爲檔案的位置以及名稱#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.getFileContent"]["fileArgu"]=$conf["fileArgu"];#參考資料:#file():取得檔案內容的行數#http:#php.net/manual/en/function.file.php#rtrim():剔除透過file()取得每行內容結尾的換行符號.$getFileContent=fileAccess::getFileContent($conf["fileAccess.getFileContent"]);unset($conf["fileAccess.getFileContent"]);#如果 讀取檔案 ".R/table-".$_SESSION["username"]."-R-CatOutput" 失敗if($getFileContent["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$getFileContent;#回傳結果return $result;}#if end#取得列項目名稱$rowStr=$getFileContent["fileContent"][0];#解析列項目名稱#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$rowStr;#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果解析列項目字串失敗if($spiltString["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$spiltString;#回傳結果return $result;}#if end#取得解析好的列項目陣列$result["content"]["yLabelName"]=$spiltString["dataArray"];#取得欄項目名稱$colStr=$getFileContent["fileContent"][1];#解析欄項目名稱#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$colStr;#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果解析列項目字串失敗if($spiltString["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$spiltString;#回傳結果return $result;}#if end#取得解析好的行項目陣列$result["content"]["xLabelName"]=$spiltString["dataArray"];#解析交叉表的結果(要回傳)#檢示分析好的資料#var_dump($getFileContent);#取得交叉分析的資料#$getFileContent["fileContent"][2];#切割 $executeRresult["lineArray"][$i] 字串#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess.spiltString"]["stringIn"]=$getFileContent["fileContent"][2];#要處理的字串。$conf["stringProcess.spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess.spiltString"]);unset($conf["stringProcess.spiltString"]);#如果解析列項目字串失敗if($spiltString["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$spiltString;#回傳結果return $result;}#if end#有幾個交叉表的元素就執行幾次迴圈for($j=0;$j<$spiltString["dataCounts"];$j++){(int)$xLabelNameKey=($j+1)/count($result["content"]["yLabelName"])-1;(int)$yLabelNameKey=($j+1)/count($result["content"]["xLabelName"])-1;#$result["content"][$i]["xLabelName"],交叉表從上致下,從左至右第$i+1個數值的x軸項目名稱.#$result["content"][$i]["yLabelName"],交叉表從上致下,從左至右第$i+1個數值的y軸項目名稱.#$result["content"][$i]["value"],交叉表從上致下,從左至右第$i+1個數值.#建立暫存的數值資訊陣列#參考資料來源:#http://php.net/manual/en/function.array-combine.php$keys=array("xLabelName","yLabelName","value");$values=array($result["content"]["xLabelName"][$xLabelNameKey],$result["content"]["yLabelName"][$yLabelNameKey],$spiltString["dataArray"][$j]);$tempArray=array_combine($keys,$values);#取得特定數值的資訊$result["content"][]=$tempArray;#debug#echo "<p>Entered!</p>";}#for end#移除 ".R/table-".$_SESSION["username"]."-R-CatOutput" 檔案#涵式說明:#移除檔案#回傳的結果:#$result["status"],"true"代表移除成功,"false"代表移除失敗.#$result["error"],錯誤訊息陣列#$result["warning"],警告訊息陣列#$result["function"],當前執行的函數名稱#必填的參數:$conf["=fileAccess.delFile"]["fileAddress"]=".R/table-".$_SESSION["username"]."-R-CatOutput";#要移除檔案的位置#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["=fileAccess.delFile"]["fileArgu"]=$conf["fileArgu"];$delFile=fileAccess::delFile($conf["=fileAccess.delFile"]);unset($conf["=fileAccess.delFile"]);#如果移除檔案失敗if($delFile["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤$result["error"]=$delFile;#回傳結果return $result;}#if end#取得執行的R腳本內容$result["RscriptContent"]=$executeRresult["RscriptContent"];#如果 $conf["crossTableAddress"] 有設定if(isset($conf["crossTableAddress"])){#如果 $conf["crossTableAddress"] 不為 ""if($conf["crossTableAddress"]!=""){$conf["crossTableAddress"]=$conf["crossTableAddress"].".html";#建立顯示交叉表結果的html檔案#函式說明:#檢查要建立的檔案路徑是否存在,若不存在則建立新檔案,若檔案已存在則會在原檔名後面加上從(1)開始的編號,再度嘗試建立檔案,以避免資料異常.#回傳的結果:#$result["status"],執行狀態,"true"代表執行正常,"false"代表執行失敗.#$result["error"],錯誤訊息陣列.#$result["createdFileName"],建立好的檔案名稱.#$result["createdFilePath"],檔案建立的路徑.#$result["createdFilePathAndName"].建立好的檔案名稱與路徑.#必填的參數:#$conf["checkedFileAndPath"],字串陣列,要建立的檔案路徑$conf["fileAccess"]["createFileAfterCheck"]["checkedFileAndPath"]=$conf["crossTableAddress"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess"]["createFileAfterCheck"]["fileArgu"]=$conf["fileArgu"];$createHtmlFile=fileAccess::createFileAfterCheck($conf["fileAccess"]["createFileAfterCheck"]);unset($conf["fileAccess"]["createFileAfterCheck"]);#如果建立顯示交叉表結果的html檔案失敗if($createHtmlFile["status"]=="false"){#設置執行不正常的識別$result["status"]="false";#設置錯誤訊息$result["status"]=$createHtmlFile;#回傳結果return $result;}#if end#初始化表格的內容語法$tableContent="<table border = 1px>";#第一列開始$tableContent=$tableContent."<tr>";#第一列第一個元素$tableContent=$tableContent."<td>".$result["content"]["yLabelTypeName"]."\\".$result["content"]["xLabelTypeName"]."</td>";#第一列後面其他的元素#有幾個 $result["content"]["xLabelName"] 就執行幾次for($i=0;$i<count($result["content"]["xLabelName"]);$i++){$tableContent=$tableContent."<td>".$result["content"]["xLabelName"][$i]."</td>";}#for end#第一列結束$tableContent=$tableContent."</tr>";#有幾個 $result["content"]["yLabelName"] 就執行幾次for($i=0;$i<count($result["content"]["yLabelName"]);$i++){#第$i+1列開始$tableContent=$tableContent."<tr>";#第$i+1列的名稱$tableContent=$tableContent."<td>".$result["content"]["yLabelName"][$i]."</td>";#有幾個 $result["content"]["xLabelName"] 就執行幾次for($j=0;$j<count($result["content"]["xLabelName"]);$j++){#第$i+1列 第$j+1欄的 數值內容$tableContent=$tableContent."<td>".$result["content"][($i*count($result["content"]["xLabelTypeName"])+$j)]["value"]."</td>";}#for end#第$i+1列結束$tableContent=$tableContent."</tr>";}#for end#表格語法的結束$tableContent=$tableContent."</table>";#寫入產生交叉表的html語法#涵式說明:#將多行字串寫入到檔案#回傳的結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#必填的參數:#$conf["fileAccess.writeMultiLine"]["fileName"],字串,爲要編輯的檔案名稱$conf["fileAccess.writeMultiLine"]["fileName"]=$createHtmlFile["createdFilePathAndName"];#$conf["fileAccess.writeMultiLine"]["inputString"],字串陣列,爲要寫入到 $conf["fileName"] 裏面的內容#$conf["fileAccess.writeMultiLine"]["inputString"][$i] 代表第 $i+1 行。$conf["fileAccess.writeMultiLine"]["inputString"][]="<html>";$conf["fileAccess.writeMultiLine"]["inputString"][]="<head>";$conf["fileAccess.writeMultiLine"]["inputString"][]="<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">";$conf["fileAccess.writeMultiLine"]["inputString"][]="</head>";$conf["fileAccess.writeMultiLine"]["inputString"][]="<body>";$conf["fileAccess.writeMultiLine"]["inputString"][]=$tableContent;$conf["fileAccess.writeMultiLine"]["inputString"][]="</body>";$conf["fileAccess.writeMultiLine"]["inputString"][]="</html>";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess.writeMultiLine"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["fileAccess.writeMultiLine"]["inputString"]["writeMethod"]="a";#爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入。$writeHtmlData=fileAccess::writeMultiLine($conf["fileAccess.writeMultiLine"]);unset($conf["fileAccess.writeMultiLine"]);#如果 寫入html 語法失敗if($writeHtmlData["status"]=="false"){#設置執行不正常的識別$result["status"]="false";#設置錯誤訊息$result["status"]=$writeHtmlData;#回傳結果return $result;}#if end}#if end}#if end#如果有設定交叉表網頁檔的保存位置if(isset($conf["crossTableAddress"])){#取得網頁檔案位置$result["content"]["htmlAddress"]=$conf["crossTableAddress"];}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function table end/*#函式說明:#交叉分析,分析兩變數的關係,將結果輸出到html檔案裡面,其中若樣本數大於30則用卡方檢定,若樣本數小於30則用費雪精確獨立性檢定。#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["content"],分析結果#$result["content"]["htmlReport"],報表網頁檔的位置#$result["content"]["pairedDataCount"],觀察值的筆數#$result["content"]["varAtype"],變數一的類別陣列#$result["content"]["varBtype"],變數二的類別陣列#$result["content"]["array"]["變數一類別之一"]["變數二類別之一"]["count"],變數一與變數二交叉位置的頻率#$result["content"]["array"]["變數一類別之一"]["變數二類別之一"]["radio"],變數一與變數二交叉位置的比例#$result["content"]["chi2"],卡方值,若不適用則為"null".#$result["content"]["df"],自由度,若不適用則為"null"#$result["content"]["chi2pValue"],p值,若不適用則為"null"#$result["content"]["fisherTestVarRelationship"],取得費雪檢定的兩變數關係,若不適用則為"null"#$result["content"]["fisherTestPvalue"],取得費雪檢定的p值,若不適用則為"null"#$result["content"]["rCode"],執行的R程式內容.#$result["content"]["rCodeFile"],#儲存輸出的R程式檔案位置與名稱.#$result["content"]["rawOutput"],R原始的分析結果輸出.#必填參數:#$conf["dnnStr"],字串陣列,每個資料集的名稱$conf["dnnStr"]=array("","");#$conf["dataArrayA"],字串陣列,要繪製交叉表的資料A,元素數量必須跟$conf["dataArrayB"]一樣。$conf["dataArrayA"]=array();#$conf["dataArrayB"],字串陣列,要繪製交叉表的資料B,元素數量必須跟$conf["dataArrayA"]一樣。$conf["dataArrayB"]=array();#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["outRfile"],字串,輸出執行的R程式腳本其儲存位置與名稱,副檔名「.R」會自動加上,預設不輸出.#$conf["outRfile"]="";#$conf["crossTableAddress"],字串,產生好的交叉分析網頁檔要存在哪裡,名稱為何,副檔名(.html)會自動補上,預設的位置與名稱為".R/crossTable-".$_SESSION["username"]#$conf["crossTableAddress"]="";#$conf["title"],字串陣列,交叉表的標題,一個元素代表一列,預設為"交叉表"#$conf["title"]=array("交叉表");#參考資料來源:#http://www2.nsysu.edu.tw/politics/liu/teaching/dataAnalysis/lectureNotes/03_descriptiveStatistics.R#卡方獨立性(或稱齊一性)檢定=>http://www.r-web.com.tw/stat/step1.php?method=chi2_test_ind_hom#費雪精確檢定=>http://www.r-web.com.tw/stat/step1.php?method=fisher_test#備註:#取得比例有時會失敗*/public static function crossTable(&$conf){#初始化要回傳的內容$result=array();#取得當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#如果 $_SESSION["username"] 不存在if(!isset($_SESSION["username"])){#設為"NULL"$_SESSION["username"]="NULL";}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","dnnStr","dataArrayA","dataArrayB");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","array","array","array");#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。#$conf["canBeEmptyString"]="false";#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("crossTableAddress","title","outRfile");#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,"null"代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(".R/crossTable-".$_SESSION["username"],array("交叉表"),"null");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("dataArrayA","dataArrayB");$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#產生資料標題R語法字串$r_VarTitle="dnnStr=c(\"".$conf["dnnStr"][0]."\",\"".$conf["dnnStr"][1]."\")";#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R::writeRfile"]["addAndName"]=".R/crossTable-".$_SESSION["username"].".R";#R檔案的位置與名稱#$conf["R::writeRfile"]["textToWrite"]=array("");#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。$conf["R::writeRfile"]["textToWrite"][]="#匯入gmodels套件";$conf["R::writeRfile"]["textToWrite"][]="library(gmodels)";$conf["R::writeRfile"]["textToWrite"][]="";$conf["R::writeRfile"]["textToWrite"][]="#產生資料標題";$conf["R::writeRfile"]["textToWrite"][]=$r_VarTitle;$conf["R::writeRfile"]["textToWrite"][]="";#從 $conf["dataArrayA"] 產生R資料變數#涵式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#必填參數:#$conf["vectorName"],字串,向量變數在R裡面的名稱。$conf["R::createFixedVectorVar"]["vectorName"]="var1";#$conf["vectorData"],陣列變數,要產生的向量變數資料。$conf["R::createFixedVectorVar"]["vectorData"]=$conf["dataArrayA"];#$conf["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["R::createFixedVectorVar"]["writeTarget"]=&$conf["R::writeRfile"]["textToWrite"];$createFixedVectorVar=R::createFixedVectorVar($conf["R::createFixedVectorVar"]);unset($conf["R::createFixedVectorVar"]);#如果從 $conf["dataArrayA"] 產生R資料變數失敗if($createFixedVectorVar["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$createFixedVectorVar;#回傳結果return $result;}#if end$conf["R::writeRfile"]["textToWrite"][]="";#從 $conf["dataArrayB"] 產生R資料變數#涵式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#必填參數:#$conf["vectorName"],字串,向量變數在R裡面的名稱。$conf["R::createFixedVectorVar"]["vectorName"]="var2";#$conf["vectorData"],陣列變數,要產生的向量變數資料。$conf["R::createFixedVectorVar"]["vectorData"]=$conf["dataArrayB"];#$conf["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["R::createFixedVectorVar"]["writeTarget"]=&$conf["R::writeRfile"]["textToWrite"];$createFixedVectorVar=R::createFixedVectorVar($conf["R::createFixedVectorVar"]);unset($conf["R::createFixedVectorVar"]);#如果從 $conf["dataArrayB"] 產生R資料變數失敗if($createFixedVectorVar["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$createFixedVectorVar;#回傳結果return $result;}#if end$conf["R::writeRfile"]["textToWrite"][]="";#放置交叉分析的語法$conf["R::writeRfile"]["textToWrite"][]="#交叉分析";#如果是小樣本(總樣本數30筆以下)if(count($conf["dataArrayA"])<30){$conf["R::writeRfile"]["textToWrite"][]="CrossTable(var1,var2,dnn=dnnStr,prop.t=FALSE,prop.c=FALSE,prop.chisq=FALSE,chisq=TRUE,fisher=TRUE)";}#if end#反之是大樣本else{$conf["R::writeRfile"]["textToWrite"][]="CrossTable(var1,var2,dnn=dnnStr,prop.t=FALSE,prop.c=FALSE,prop.chisq=FALSE,chisq=TRUE,fisher=FALSE)";}#if end#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R::writeRfile"]["fileArgu"]=$conf["fileArgu"];$writeRfile=R::writeRfile($conf["R::writeRfile"]);unset($conf["R::writeRfile"]);#如果建立R腳本檔案失敗if($writeRfile["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$writeRfile;#回傳結果return $result;}#if end#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#$result["RscriptContent"],執行的R腳本內容,一個元素代表一列.#必填的參數:#$conf["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R::executeR"]["rPositionAndName"]=$writeRfile["newCreatedRfilePathAndName"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["R::executeR"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["disbaleOptimal"]="true";$executeR=R::executeR($conf["R::executeR"]);unset($conf["R::executeR"]);#如果執行R腳本失敗if($executeR["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$executeR;#回傳結果return $result;}#if end#取得交叉分析的原始結果$result["content"]["rawOutput"]=$executeR["lineArray"];#取得執行的R腳本內容$result["content"]["rCode"]=$executeR["RscriptContent"];#如果有設置 $conf["outRfile"]if($conf["outRfile"]){#將 $result["content"]["rCode"] 內容寫入到 R 檔案裡面#涵式說明:#將多行字串寫入到檔案#回傳的結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#必填的參數:#$conf["fileName"],字串,爲要編輯的檔案名稱$conf["fileAccess::writeMultiLine"]["fileName"]=$conf["outRfile"].".R";#$conf["inputString"],字串陣列,爲要寫入到 $conf["fileName"] 裏面的內容#$conf["inputString"][$i] 代表第 $i+1 行。$conf["fileAccess::writeMultiLine"]["inputString"]=$result["content"]["rCode"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::writeMultiLine"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["writeMethod"]="a";#爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入。$outRfile=fileAccess::writeMultiLine($conf["fileAccess::writeMultiLine"]);unset($conf["fileAccess::writeMultiLine"]);#如果輸出R腳本失敗if($outRfile["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$outRfile;#回傳結果return $result;}#if end#儲存輸出的R程式檔案位置與名稱$result["content"]["rCodeFile"]=$conf["outRfile"].".R";}#if end#初始化儲存資料分析的起點列數$rowStartLine=0;#有幾列輸出就執行幾次迴圈for($i=0;$i<$executeR["lineCount"];$i++){#var_dump($executeR["lineArray"][$i]);#定位到有 "Total Observations in Table:" 的列#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search::findKeyWord"]["keyWord"]="Total Observations in Table:";#想要搜尋的關鍵字$conf["search::findKeyWord"]["string"]=$executeR["lineArray"][$i];#要被搜尋的字串內容#可省略的參數:#$conf["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$findKeyWord=search::findKeyWord($conf["search::findKeyWord"]);unset($conf["search::findKeyWord"]);#如果搜尋關鍵字失敗if($findKeyWord["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$findKeyWord;#回傳結果return $result;}#if end#如果有找到關鍵字if($findKeyWord["founded"]=="true"){#取得分析結果開始的列數$rowStartLine=$i;#跳出迴圈break;}#if end}#for end#解析資料的筆數#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$rowStartLine];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]=": ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#取得觀察值筆數$result["content"]["pairedDataCount"]=$spiltString["dataArray"][1];#取得變數一($conf["dataArrayA"])的種類#初始化儲存變數一$conf["dataArrayA"])的種類$result["content"]["varAtype"]=array();#debug#var_dump($rowStartLine+6);#var_dump($executeR["lineCount"]);#執行迴圈直到遇到 "Column Total" 為止,一次加三for($i=$rowStartLine+6;$i<$executeR["lineCount"];$i=$i+3){#echo "<p>entered!</p>";#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$i];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]="|";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#搜尋分割好的第一個字串是否有關鍵字 "Column Total"#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search::findKeyWord"]["keyWord"]="Column Total";#想要搜尋的關鍵字$conf["search::findKeyWord"]["string"]=$spiltString["dataArray"][0];#要被搜尋的字串內容#可省略的參數:#$conf["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$findKeyWord=search::findKeyWord($conf["search::findKeyWord"]);unset($conf["search::findKeyWord"]);#如果尋找關鍵字失敗if($findKeyWord["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$findKeyWord;#回傳結果return $result;}#if end#如果有找到關鍵字 "Column Total"if($findKeyWord["founded"]=="true"){#跳出迴圈break;}#if end#剔除變數一類別字串的空白#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess::correctCharacter"]["stringIn"]=$spiltString["dataArray"][0];#爲要處理的字串#可省略的參數:$conf["stringProcess::correctCharacter"]["selectedCharacter"]=array(" ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess::correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$correctCharacter=stringProcess::correctCharacter($conf["stringProcess::correctCharacter"]);unset($conf["stringProcess::correctCharacter"]);#如果 處理類別字串失敗if($correctCharacter["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$correctCharacter;#回傳結果return $result;}#if end#取得第一個變數的種類字串$result["content"]["varAtype"][]=$correctCharacter["content"];}#for end#取得變數二($conf["dataArrayB"])的種類#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$rowStartLine+4];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]="|";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#初始化儲存變數二($conf["dataArrayB"])的種類$result["content"]["varBtype"]=array();#執行 分割成的段數-2 次迴圈(亦即去頭去尾)for($i=1;$i<$spiltString["dataCounts"]-1;$i++){#剔除變數二類別字串的空白#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess::correctCharacter"]["stringIn"]=$spiltString["dataArray"][$i];#爲要處理的字串#可省略的參數:$conf["stringProcess::correctCharacter"]["selectedCharacter"]=array(" ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess::correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$correctCharacter=stringProcess::correctCharacter($conf["stringProcess::correctCharacter"]);unset($conf["stringProcess::correctCharacter"]);#如果處理字串失敗if($correctCharacter["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$correctCharacter;#回傳結果return $result;}#if end#取得變數二類別$result["content"]["varBtype"][]=$correctCharacter["content"];}#for end#$executeR["lineArray"][$rowStartLine]#依據變數一與二建立交叉分析數據的頻率#執行迴圈直到遇到 "Column Total" 為止,一次加三for($i=$rowStartLine+6;$i<$executeR["lineCount"];$i=$i+3){#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$i];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]="|";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#搜尋分割好的第一個字串是否有關鍵字 "Column Total"#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search::findKeyWord"]["keyWord"]="Column Total";#想要搜尋的關鍵字$conf["search::findKeyWord"]["string"]=$spiltString["dataArray"][0];#要被搜尋的字串內容#可省略的參數:#$conf["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$findKeyWord=search::findKeyWord($conf["search::findKeyWord"]);unset($conf["search::findKeyWord"]);#如果尋找關鍵字失敗if($findKeyWord["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$findKeyWord;#回傳結果return $result;}#if end#如果有找到關鍵字 "Column Total"if($findKeyWord["founded"]=="true"){#跳出迴圈break;}#if end#debug#echo "<p>entered!<p>";#執行 分割成的段數-2 次迴圈(亦即去頭去尾)for($j=1;$j<$spiltString["dataCounts"]-1;$j++){#debug#echo "<p>entered!<p>";#剔除變數一類別字串的空白#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess::correctCharacter"]["stringIn"]=$spiltString["dataArray"][0];#爲要處理的字串#可省略的參數:$conf["stringProcess::correctCharacter"]["selectedCharacter"]=array(" ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess::correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$correctCharacter=stringProcess::correctCharacter($conf["stringProcess::correctCharacter"]);unset($conf["stringProcess::correctCharacter"]);#如果 處理類別字串失敗if($correctCharacter["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$correctCharacter;#回傳結果return $result;}#if end#暫存變數一的名稱$var1Name=$correctCharacter["content"];#暫存變數二的名稱$var2Name=$result["content"]["varBtype"][$j-1];#剔除變數一與類別二交叉的頻率字串的空白#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess::correctCharacter"]["stringIn"]=$spiltString["dataArray"][$j];#爲要處理的字串#可省略的參數:$conf["stringProcess::correctCharacter"]["selectedCharacter"]=array(" ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess::correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$correctCharacter=stringProcess::correctCharacter($conf["stringProcess::correctCharacter"]);unset($conf["stringProcess::correctCharacter"]);#如果 處理類別字串失敗if($correctCharacter["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$correctCharacter;#回傳結果return $result;}#if end#取得頻率$result["content"]["array"][$var1Name][$var2Name]["count"]=$correctCharacter["content"];}#for end}#for end#依據變數一與二建立交叉分析數據的比例#執行迴圈直到遇到 "Column Total" 為止,一次加三for($i=$rowStartLine+7;$i<$executeR["lineCount"];$i=$i+3){#debug#echo "<p>entered!<p>";#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$i];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]="|";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#debug#var_dump($spiltString);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#搜尋分割好的第一個字串是否有關鍵字 "-"#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search::findKeyWord"]["keyWord"]="-";#想要搜尋的關鍵字$conf["search::findKeyWord"]["string"]=$spiltString["dataArray"][0];#要被搜尋的字串內容#可省略的參數:#$conf["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$findKeyWord=search::findKeyWord($conf["search::findKeyWord"]);unset($conf["search::findKeyWord"]);#如果尋找關鍵字失敗if($findKeyWord["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$findKeyWord;#回傳結果return $result;}#if end#如果有找到關鍵字 "-"if($findKeyWord["founded"]=="true"){#跳出迴圈break;}#if end#B變數有幾個類別就執行幾次for($j=0;$j<count($result["content"]["varBtype"]);$j++){#debug#echo "<p>entered!<p>";#debug#var_dump($spiltString);#debug#echo "\r\n".$spiltString["dataArray"][$j+1]."\r\n";#剔除變數A與B交叉的頻率比例字串的空白#涵式說明:#處理字串避免網頁出錯#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數.#$result["content"],爲處理好的字串.#$result["error"],錯誤訊息陣列.#必填的參數:$conf["stringProcess::correctCharacter"]["stringIn"]=$spiltString["dataArray"][$j+1];#爲要處理的字串#可省略的參數:$conf["stringProcess::correctCharacter"]["selectedCharacter"]=array(" ");#爲被選擇要處理的字串/字元,須爲陣列值。#若不設定則預設爲要將這些字串作替換("<",">","=","//","'","$","%","&","|","/*","*\/","#","\"")。#特殊字元,「\n」代表換行,「\t」代表tab鍵的間隔$conf["stringProcess::correctCharacter"]["changeTo"]=array("");#爲被選擇的字元要換成什麼字串/字元,須爲陣列值。若不設定,則預設爲更換成""(空字串)。$correctCharacter=stringProcess::correctCharacter($conf["stringProcess::correctCharacter"]);unset($conf["stringProcess::correctCharacter"]);#debug#echo "\r\n\$i=".$i." \$rowStartLine=".$rowStartLine." BtypeCount=".count($result["content"]["varBtype"])."\r\n";#debug#echo "\r\n".($i-7-$rowStartLine)/(3)."\r\n";#debug#echo "\r\n[".$result["content"]["varAtype"][(($i-7-$rowStartLine)/3)]."][".$result["content"]["varBtype"][$j]."][\"radio\"]=".$correctCharacter["content"]."\r\n";#debug#var_dump($correctCharacter);#如果剔除空白失敗if($correctCharacter["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$correctCharacter;#回傳結果return $result;}#if end#取得變數A與B交叉的比例$result["content"]["array"][$result["content"]["varAtype"][($i-7-$rowStartLine)/(3)]][$result["content"]["varBtype"][$j]]["radio"]=$correctCharacter["content"];}#for end}#for end#初始化儲存卡方檢定結果開始的列數$chiSquaredStartRow=0;#尋找 "Pearson's Chi-squared test" 所在的列數#有幾列輸出就執行幾次迴圈for($i=0;$i<$executeR["lineCount"];$i++){#定位到有 "Pearson's Chi-squared test" 的列#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search::findKeyWord"]["keyWord"]="Pearson's Chi-squared test";#想要搜尋的關鍵字$conf["search::findKeyWord"]["string"]=$executeR["lineArray"][$i];#要被搜尋的字串內容#可省略的參數:#$conf["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$findKeyWord=search::findKeyWord($conf["search::findKeyWord"]);unset($conf["search::findKeyWord"]);#如果搜尋關鍵字失敗if($findKeyWord["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$findKeyWord;#回傳結果return $result;}#if end#如果有找到關鍵字if($findKeyWord["founded"]=="true"){#取得卡方檢定結果開始的列數$chiSquaredStartRow=$i;#跳出迴圈break;}#if end}#for end#解析卡方檢定的結果#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$chiSquaredStartRow+2];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#取得卡方值$result["content"]["chi2"]=$spiltString["dataArray"][2];#取得自由度$result["content"]["df"]=$spiltString["dataArray"][5];#取得p值$result["content"]["chi2pValue"]=$spiltString["dataArray"][8];#如果是小樣本(總樣本數30筆以下)if(count($conf["dataArrayA"])<30){#初始化儲存費雪檢定結果開始的列數$fisherTestStartRow=0;#尋找 "Fisher's Exact Test for Count Data" 所在的列數#有幾列輸出就執行幾次迴圈for($i=0;$i<$executeR["lineCount"];$i++){#定位到有 "Fisher's Exact Test for Count Data" 的列#函式說明:#檢查字串裡面有無指定的關鍵字#回傳的結果:#$result["status"],"true"代表執行成功,"false"代表執行失敗。#$result["error"],錯誤訊息#$result["founded"],是否找到關鍵字,"true"代表有找到關鍵字;"false"代表沒有找到關鍵字。#$result["keyWordCount"],找到的關鍵字數量.#必填的參數:$conf["search::findKeyWord"]["keyWord"]="Fisher's Exact Test for Count Data";#想要搜尋的關鍵字$conf["search::findKeyWord"]["string"]=$executeR["lineArray"][$i];#要被搜尋的字串內容#可省略的參數:#$conf["completeEqual"]="true";#是否內容要完全符合,不能多出任何不符合的內容,預設為不需要完全符合。$findKeyWord=search::findKeyWord($conf["search::findKeyWord"]);unset($conf["search::findKeyWord"]);#如果搜尋關鍵字失敗if($findKeyWord["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$findKeyWord;#回傳結果return $result;}#if end#如果有找到關鍵字if($findKeyWord["founded"]=="true"){#取得費雪檢定結果開始的列數$fisherTestStartRow=$i;#跳出迴圈break;}#if end}#for end#取得費雪檢定的兩變數關係$result["content"]["fisherTestVarRelationship"]=$executeR["lineArray"][$fisherTestStartRow+2];#解析費雪檢定結果#涵式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$executeR["lineArray"][$fisherTestStartRow+3];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]=" ";#爲以哪個符號作爲分割#備註:#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#取得費雪檢定的p值$result["content"]["fisherTestPvalue"]=$spiltString["dataArray"][2];}#if end#反之是大於30筆樣本的大樣本else{#取得費雪檢定的兩變數關係$result["content"]["fisherTestVarRelationship"]="不適用於大樣本";#取得費雪檢定的p值$result["content"]["fisherTestPvalue"]="不適用於大樣本";}#else end#輸出網頁檔的位置#$conf["crossTableAddress"]#初始化儲存交叉分析表標題的字串$title="";#標題陣列變數有幾個就執行幾次迴圈for($i=0;$i<count($conf["title"]);$i++){#如果是最後一個元素if($i==count($conf["title"])-1){$title=$title.$conf["title"][$i]."<p>";}#if end#反之不是最後一個元素else{$title=$title.$conf["title"][$i]."<br>";}#else end}#for end#初始化交叉分析表格呈現的html語法$tableContent="<table border = 1px>";#第一列開始$tableContent=$tableContent."<tr>";#第一列欄開始$tableContent=$tableContent."<td>".$conf["dnnStr"][0]."\\".$conf["dnnStr"][1]."</td>";#第一列變數B的種類名稱for($i=0;$i<count($result["content"]["varBtype"]);$i++){$tableContent=$tableContent."<td>".$result["content"]["varBtype"][$i]."</td>";}#for end#第一列結束$tableContent=$tableContent."</tr>";#變數A有幾類就執行幾次for($i=0;$i<count($result["content"]["varAtype"]);$i++){#列的開始$tableContent=$tableContent."<tr>";#放置變數A的類別名稱$tableContent=$tableContent."<td>".$result["content"]["varAtype"][$i]."</td>";#變數B有幾種就執行幾次for($k=0;$k<count($result["content"]["varBtype"]);$k++){#如果沒有比比例數值if(!isset($result["content"]["array"][$result["content"]["varAtype"][$i]][$result["content"]["varBtype"][$k]]["radio"])){#預設為"0.0"$result["content"]["array"][$result["content"]["varAtype"][$i]][$result["content"]["varBtype"][$k]]["radio"]="0.0";}#if end#欄的內容$tableContent=$tableContent."<td>".$result["content"]["array"][$result["content"]["varAtype"][$i]][$result["content"]["varBtype"][$k]]["count"]."<=>".$result["content"]["array"][$result["content"]["varAtype"][$i]][$result["content"]["varBtype"][$k]]["radio"]."</td>";}#for end#列的結束$tableContent=$tableContent."</tr>";}#for end#表格結束$tableContent=$tableContent."</table>";#建立網頁檔#涵式說明:#將多行字串寫入到檔案#回傳的結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#必填的參數:#$conf["fileName"],字串,爲要編輯的檔案名稱$conf["fileAccess::writeMultiLine"]["fileName"]=$conf["crossTableAddress"].".html";#$conf["inputString"],字串陣列,爲要寫入到 $conf["fileName"] 裏面的內容#$conf["inputString"][$i] 代表第 $i+1 行。$conf["fileAccess::writeMultiLine"]["inputString"][]="<html>";$conf["fileAccess::writeMultiLine"]["inputString"][]="<head>";$conf["fileAccess::writeMultiLine"]["inputString"][]="<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">";$conf["fileAccess::writeMultiLine"]["inputString"][]="</head>";$conf["fileAccess::writeMultiLine"]["inputString"][]="<body>";$conf["fileAccess::writeMultiLine"]["inputString"][]=$title;$conf["fileAccess::writeMultiLine"]["inputString"][]=$tableContent;$conf["fileAccess::writeMultiLine"]["inputString"][]="<p>";$conf["fileAccess::writeMultiLine"]["inputString"][]="卡方檢定 卡方值:".$result["content"]["chi2"]." 自由度:".$result["content"]["df"]." p值:".$result["content"]["chi2pValue"]."<p>";$conf["fileAccess::writeMultiLine"]["inputString"][]="費雪檢定 兩變數關係:".$result["content"]["fisherTestVarRelationship"]." p值:".$result["content"]["fisherTestPvalue"]."<br>";$conf["fileAccess::writeMultiLine"]["inputString"][]="</body>";$conf["fileAccess::writeMultiLine"]["inputString"][]="</html>";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::writeMultiLine"]["fileArgu"]=$conf["fileArgu"];#可省略的參數:#$conf["fileAccess::writeMultiLine"]["writeMethod"]="a";#爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入。$createHtmlReport=fileAccess::writeMultiLine($conf["fileAccess::writeMultiLine"]);unset($conf["fileAccess::writeMultiLine"]);#如果建立交叉分析報表網頁檔失敗if($createHtmlReport["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$createHtmlReport;#回傳結果return $result;}#if end#取得產生的網頁檔位置$result["content"]["htmlReport"]=$conf["crossTableAddress"].".html";#設置執行正常$result["status"]="true";#回傳結果return $result;}#function crossTable end/*#函式說明:#運用線性模式進行關聯分析#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["content"],分析結果#必填參數:#$conf["csvFile"],字串,要讀取的csv檔位置與名稱。$conf["csvFile"]="";#$conf["factorVarNameArray"],字串陣列,用於預測的變數欄位名稱。$conf["factorVarNameArray"]=array();#$conf["forcastVarName"],字串陣列,用於預測的變數欄位名稱。$conf["forcastVarName"]=array();#可省略參數:#無.#參考資料:#無.#備註:#建構中...#目前考慮停止開發,因爲無法用名目尺度去推論。*/public static function lm(&$conf){#初始化要回傳的結果$result=array();#如果 $conf 不等於 "array"if(gettype($conf)!="array"){#設定錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]="參數的Key指定有誤!";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查必填參數#涵式說明:#檢查陣列裡面的特定元素是否存在以及其變數型態是否正確,如果沒有設定則回傳提示訊息。#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:$conf["variableCheck.isexistMulti"]["varInput"]=$conf;#要檢查的陣列變數$conf["variableCheck.isexistMulti"]["variableCheck"]=array("csvFile","factorVarNameArray","forcastVarName");#要檢查的變數名稱陣列,形態爲陣列變數,例如: $conf["variableCheck"] = array("id","account","password");#可以省略的參數:$conf["variableCheck.isexistMulti"]["variableType"]=array("string","array","name");#要檢查的陣列變數內的元素應該爲何種變數形態,形態爲陣列 例如: $conf[variableType] = array("string","int","double");$conf["variableCheck.isexistMulti"]["canBeEmptyString"]="false";#變數內容如果是空字串就不能算是有設置的話,請設為"false",預設為也算是有設置。$checkResult=variableCheck::isexistMulti($conf["variableCheck.isexistMulti"]);unset($conf["variableCheck.isexistMulti"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#初始化要寫入到R腳本的逐行內容$dataToWrite=array();$dataToWrite[]="#線性迴歸分析";#涵式說明:#建立R檔案#回傳的結果:#$result["status"],執行是否成功,"true"代表成功,"false"代表失敗.#$result["error"],錯誤訊息陣列.#$result["newCreatedRfilePathAndName"],R腳本檔的位置與名稱#必填的參數:$conf["R.writeRfile"]["addAndName"]=".R/".$_SESSION["username"]."-lm.R";#R檔案的位置與名稱$conf["R.writeRfile"]["textToWrite"]=array("");#要寫入的字串內容陣列,一個元素代表一行文字,每行結尾會自動換行。$writeRfileResult=R::writeRfile($conf["R.writeRfile"]);unset($conf["R.writeRfile"]);#如果 R 腳本寫入失敗if($writeRfileResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$writeRfileResult;#回傳結果return $result;}#if end#取得R腳本的位置$rScriptAdd=$writeRfileResult["newCreatedRfilePathAndName"];#執行R腳本#函式說明:#執行R腳本,執行完畢後,會刪除R的腳本與暫存R執行後的輸出的檔案.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["errror"],錯誤訊息陣列#$result["lineArray"],字串陣列,R輸出結果,每個元素代表一行的輸出.#$result["lineCount"],整數,R輸出的總共行數.#必填的參數:#$conf["R.executeR"]["rPositionAndName"],字串,R腳本的位置與名稱.$conf["R.executeR"]["rPositionAndName"]=$rScriptAdd;#可省略的參數:#$conf["R.executeR"]["disbaleOptimal"],字串,"true"代表取消輸出的優化,可以顯示版本訊息、歡迎訊息、儲存暫存檔,預設為"false"要進行優化.#$conf["R.executeR"]["disbaleOptimal"]="true";$executeResult=R::executeR($conf["R.executeR"]);unset($conf["R.executeR"]);#如果執行R腳本出錯if($executeResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$executeResult;#回傳結果return $result;}#if end}#function lm end/*#函式說明:#避免超出4096bytes限制的條件下產生向量變數語法#請勿使用 vectorPart 作為R的變數,因為這是用於組合向量變數的暫存變數.#回傳結果:#$result["status"],執行正常與否,"true"代表正常;"false"代表不正常#$result["error"],錯誤訊息陣列#$result["function"],當前函數名稱#$result["rVectorCreate"],建立R向量變數的語法陣列,一個元素代表一列的內容。#$result["lineCount"],用了幾列程式完成向量變數的建立#必填參數:#$conf["vectorName"],字串,向量變數在R裡面的名稱。$conf["vectorName"]="";#$conf["vectorData"],陣列變數,要產生的向量變數資料。$conf["vectorData"]=array();#$conf["writeTarget"],參考陣列變數,向量變數產生的語法要寫入哪個儲存R腳本的陣列變數。$conf["writeTarget"]=&;#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function createFixedVectorVar(&$conf){#初始化要回傳的內容$result=array();#取得當前函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#初始化儲存建立R向量變數的語法陣列$result["rVectorCreate"]=array();#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#必填寫的參數:#$conf["variableCheck.checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck.checkArguments"]["varInput"]=&$conf;#$conf["variableCheck.checkArguments"]"mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck.checkArguments"]["mustBeFilledVariableName"]=array("vectorName","vectorData","writeTarget");#$conf["variableCheck.checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");$conf["variableCheck.checkArguments"]["mustBeFilledVariableType"]=array("string","array","array");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck.checkArguments"]["referenceVarKey"]="variableCheck.checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"false"。#$conf["canBeEmptyString"]="false";#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["skipableVariableName"]=array();#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["skipableVariableType"]=array();#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,"null"代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["skipableVarDefaultValue"]=array("");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();$checkResult=variableCheck::checkArguments($conf["variableCheck.checkArguments"]);unset($conf["variableCheck.checkArguments"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行不正常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#計算 $conf["vectorData"] 10個一組,可以有幾組(int)$groupsCount=count($conf["vectorData"])/10;#有幾組就執行幾次for($i=0;$i<$groupsCount;$i++){#初始化暫存向量變數語法的變數$rVectorPart="vectorPart=c(";#一次最多執行10次for($j=$i*10;$j<($i+1)*10;$j++){#如果已經讀完全部的向量變數了if(!isset($conf["vectorData"][$j])){#debug#echo "entered!";#結束向量變數語法$rVectorPart=$rVectorPart.")";#跳出迴圈break;}#if end#如果是該組第一個向量資料if($j==$i*10){#串聯建立向量變數的語法$rVectorPart=$rVectorPart."\"".$conf["vectorData"][$j]."\"";}#if end#反之不是該組第一個向量資料else{#串聯建立向量變數的語法,向量資料前要加一個逗號。$rVectorPart=$rVectorPart.",\"".$conf["vectorData"][$j]."\"";}#else end#如果是該組的最後一個向量內容if($j==($i+1)*10-1){#結束向量變數語法$rVectorPart=$rVectorPart.")";}#if end}#for end#儲存產生部分向量變數內容的R語法$result["rVectorCreate"][]=$rVectorPart;#如果是第一組if($i==0){#直接取得向量變數的內容$result["rVectorCreate"][]=$conf["vectorName"]."=vectorPart";}#if end#反之不是第一組else{#組合向量變數的內容$result["rVectorCreate"][]=$conf["vectorName"]."=c(".$conf["vectorName"].",vectorPart)";}#else end}#for end#$result["rVectorCreate"]有幾個元素就執行幾次for($i=0;$i<count($result["rVectorCreate"]);$i++){#增加一列建立向量變數的語法$conf["writeTarget"][]=$result["rVectorCreate"][$i];}#for end#用了幾列程式完成向量變數的建立$result["lineCount"]=count($result["rVectorCreate"]);#設置執行正常的識別$result["status"]="true";#回傳結果return $result;}#function createFixedVectorVar end/*#函式說明:#求算相關係數(皮爾森係數),結果會回傳1數值。代表兩筆數據的相關層度,正值代表正相關;負值代表負相關。#回傳結果:#$result["status"],執行是否成功的識別,"true"代表執行正常,"false"代表執行不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["content"],相關係數(皮爾森係數).#必填參數:#$conf["rawDataArrayA"],字串陣列,爲第1組數據,元素數量須與$rawDataArray["B"]一樣。$conf["rawDataArrayA"]=array("");#$conf["rawDataArrayB"],字串陣列,爲第2組數據,元素數量須與$rawDataArray["A"]一樣。$conf["rawDataArrayB"]=array("");#可省略參數:#無#參考資料:#http://www.statmethods.net/stats/correlations.html#備註:#建構中*/public static function computeCorrelationCoefficientForNumbericData(&$conf){#初始化要回傳的內容$result=array();#記錄當前執行的函數名稱$result["function"]=__FUNCTION__;#初始化要回傳的相關係數(皮爾森係數)$result["content"]="";#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("rawDataArrayA","rawDataArrayB");#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","array");#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。$conf["variableCheck::checkArguments"]["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("asc");#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("rawDataArrayA","rawDataArrayB");#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查參數失敗if($checkArguments["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end}#function computeCorrelationCoefficientForNumbericData end}#class R end?>