java調用r的腳本
⑴ java通過Rserve調用R函數來生成圖形的方法
你一定要用java嗎?如果做一個web應用的話可以試一下shiny
http://www.rstudio.com/shiny/
⑵ 可以被java調用的腳本語言
python 語言。
python為腳本語言,易學。與各種語言的融合性較好,被稱作膠水語言。同時,目前該語言的使用量穩步上升至次於java,c++,c的第四位。此外,著名的自由軟體作者Eric Raymond在他的文章《如何成為一名黑客》中,將Python列為黑客應當學習的四種編程語言之一。
你可以參考:http://ke..com/view/21087.htm
取得更詳細介紹。
⑶ linux環境下,java怎麼調用R語言
1、下載wgethttp://mirror.bjtu.e.cn/cran/src/base/R-3/R-3.0.1.tar.gz2、解壓:tar-zxvfR-3.0.1.tar.gzcdR-3.0.13、安裝(當然也可以跳過)yuminstallreadline-develyuminstalllibXt-devel./configure4、配置環境並編譯安裝#如果使用rJava需要加上--enable-R-shlib(這個我不需要,所以加入到後面)#如果3沒安裝,那麼後面加上:--with-readline=no--with-x=no./configure--prefix=/usr/R-3.0.1make$$makeinstall5、配置環境變數並生效vi.bash_profileexportR_HOME=/usr/R-3.0.1exportPATH=.:$R_HOME/bin:$PATH#試環境變數生效source.bash_profile6、命令行測試[admin@JDsoftware]$RWARNING:ignoringenvironmentvalueofR_HOMERversion3.0.1(2013-05-16)--"GoodSport"Copyright(C):x86_64-unknown-linux-gnu(64-bit)R是自由軟體,不帶任何擔保。在某些條件下你可以將其自由散布。用'license()'或'licence()'來看散布的詳細條件。R是個合作計劃,有許多人為之做出了貢獻.用'contributors()'來看合作者的詳細情況用'citation()'會告訴你如何在出版物中正確地引用R或R程序包。用'demo()'來看一些示範程序,用'help()'來閱讀在線幫助文件,或用'help.start()'通過HTML瀏覽器來看幫助文件。用'q()'退出R.>q()7、創建腳本測試(t.R)cd/opt/script/Rvimt.R#!/path/to/Rscript#第一行x<-c(1,2,3)#R語言代碼y<-c(102,299,301)model<-lm(y~x)summary(model)8、測試:執行腳本RCMDBATCH--args/opt/script/R/t.Rmore/opt/script/R/t.Rout#查看執行的結果或者第二種方式Rscript/opt/script/R/test.R#結果直接輸出到終端
⑷ JAVA怎麼把值傳遞給R語言的腳本裡面
何寫R語言腳本 method 依 依.創建file.R文件 貳.文件首行 #!/path/to/Rscript 三.面行鍵入R代碼 四.保存(png()jpeg()等函數代碼定要dev.off()) 5.file.R工作目錄終端輸入命令 R CMD BATCH --args file.R method 貳 依.創建R腳本 貳.文件首行 #!/usr/bin/env Rscript 三.終端輸入命令 R CMD BATCH --args file.R 或者 Rscript file.R chmod 漆55 file.R ./file.R method 三 依.file.sh文件鍵入: #!/bin/sh R --slave [other option]<file.sh method 四 歸R環境 >source("/homeR/file.R"
⑸ 怎麼通過java去調用並執行shell腳本以及問題總結
對於第一個問題:java抓取,並且把結果打包。那麼比較直接的做法就是,java接收各種消息(db,metaq等等),然後藉助於jstorm集群進行調度和抓取。
最後把抓取的結果保存到一個文件中,並且通過調用shell打包, 回傳。 也許有同學會問,
為什麼不直接把java調用odps直接保存文件,答案是,我們的集群不是hz集群,直接上傳odps速度很有問題,因此先打包比較合適。(這里不糾結設計了,我們回到正題)
java調用shell的方法
通過ProcessBuilder進行調度
這種方法比較直觀,而且參數的設置也比較方便, 比如我在實踐中的代碼(我隱藏了部分業務代碼):
ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
param2, param3);
pb.directory(new File(SHELL_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start();
try {
runningStatus = p.waitFor();
} catch (InterruptedException e) {
}
} catch (IOException e) {
}
if (runningStatus != 0) {
}
return;
這里有必要解釋一下幾個參數:
RUNNING_SHELL_FILE:要運行的腳本
SHELL_FILE_DIR:要運行的腳本所在的目錄; 當然你也可以把要運行的腳本寫成全路徑。
runningStatus:運行狀態,0標識正常。 詳細可以看java文檔。
param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,2,$3分別拿到的參數。
直接通過系統Runtime執行shell
這個方法比較暴力,也比較常用, 代碼如下:
p = Runtime.getRuntime().exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);
p.waitFor();
我們發現,通過Runtime的方式並沒有builder那麼方便,特別是參數方面,必須自己加空格分開,因為exec會把整個字元串作為shell運行。
可能存在的問題以及解決方法
如果你覺得通過上面就能滿足你的需求,那麼可能是要碰壁了。你會遇到以下情況。
沒許可權運行
這個情況我們團隊的朱東方就遇到了, 在做DTS遷移的過程中,要執行包裡面的shell腳本, 解壓出來了之後,發現執行不了。 那麼就按照上面的方法授權吧
java進行一直等待shell返回
這個問題估計更加經常遇到。 原因是, shell腳本中有echo或者print輸出, 導致緩沖區被用完了! 為了避免這種情況, 一定要把緩沖區讀一下, 好處就是,可以對shell的具體運行狀態進行log出來。 比如上面我的例子中我會變成:
ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim(),
taskId.toString(), fileName);
pb.directory(new File(CASPERJS_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start();
BufferedReaderstdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReaderstdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = stdInput.readLine()) != null) {
LOG.error(s);
}
while ((s = stdError.readLine()) != null) {
LOG.error(s);
}
try {
runningStatus = p.waitFor();
} catch (InterruptedException e) {
}
記得在start()之後, waitFor()之前把緩沖區讀出來打log, 就可以看到你的shell為什麼會沒有按照預期運行。 這個還有一個好處是,可以讀shell裡面輸出的結果, 方便java代碼進一步操作。
也許你還會遇到這個問題,明明手工可以運行的命令,java調用的shell中某一些命令居然不能執行,報錯:命令不存在!
比如我在使用casperjs的時候,手工去執行shell明明是可以執行的,但是java調用的時候,發現總是出錯。
通過讀取緩沖區就能發現錯誤日誌了。 我發現即便自己把安裝的casperjs的bin已經加入了path中(/etc/profile,
各種bashrc中)還不夠。 比如:
exportNODE_HOME="/home/admin/node"
exportCASPERJS_HOME="/home/admin/casperjs"
exportPHANTOMJS_HOME="/home/admin/phantomjs"
exportPATH=$PATH:$JAVA_HOME/bin:/root/bin:$NODE_HOME/bin:$CASPERJS_HOME/bin:$PHANTOMJS_HOME/bin
原來是因為java在調用shell的時候,默認用的是系統的/bin/下的指令。特別是你用root許可權運行的時候。 這時候,你要在/bin下加軟鏈了。針對我上面的例子,就要在/bin下加軟鏈:
ln -s /home/admin/casperjs/bin/casperjscasperjs;
ln -s /home/admin/node/bin/nodenode;
ln -s /home/admin/phantomjs/bin/phantomjsphantomjs;
這樣,問題就可以解決了。
如果是通過java調用shell進行打包,那麼要注意路徑的問題了
因為shell裡面tar的壓縮和解壓可不能直接寫:
tar -zcf /home/admin/data/result.tar.gz /home/admin/data/result
直接給你報錯,因為tar的壓縮源必須到路徑下面, 因此可以寫成
tar -zcf /home/admin/data/result.tar.gz -C /home/admin/data/ result
如果我的shell是在jar包中怎麼辦?
答案是:解壓出來。再按照上面指示進行操作。(1)找到路徑
String jarPath = findClassJarPath(ClassLoaderUtil.class);
JarFiletopLevelJarFile = null;
try {
topLevelJarFile = new JarFile(jarPath);
Enumeration<JarEntry> entries = topLevelJarFile.entries();
while (entries.hasMoreElements()) {
JarEntryentry = entries.nextElement();
if (!entry.isDirectory() entry.getName().endsWith(".sh")) {
對你的shell文件進行處理
}
}
對文件處理的方法就簡單了,直接touch一個臨時文件,然後把數據流寫入,代碼:
FileUtils.touch(tempjline);
tempjline.deleteOnExit();
FileOutputStreamfos = new FileOutputStream(tempjline);
IOUtils.(ClassLoaderUtil.class.getResourceAsStream(r), fos);
fos.close();