2013-02-05 44 views
0

我正在使用RA環境使用R環境的Web應用程序。我使用AJAX.updater函數向R腳本發送了幾個變量,然後返回給瀏覽器一個ResponseText來顯示。這沒有問題,但現在我希望將變量發送給繪製圖形的R腳本,然後我想將圖像返回給瀏覽器。我想發送變量到R然後R發送圖像到瀏覽器

我能夠用R與腳本,例如在瀏覽器中顯示繪製圖像:

<% setContentType("image/png") 
t <- tempfile() 

load(file="/var/www/oraculo/brew/ICER") 

png(t, width=3.25, height=3.25, units="in", res=1200, pointsize=4) 
plot(G,vertex.size=1,vertex.label=NA) 
dev.off() 
sendBin(**readBin**(t,'raw',n=file.info(t)$size)) 
unlink(t) 


DONE 
%> 

併發送一個變量,並返回文本字符串的其他腳本:

new Ajax.Updater('numFermin', '../brew/shortestPath.rhtml', 
      { 
       'method': 'GET', 
       'parameters': {'autini': autini, 'autfin':centro, 'XarXaj':     red}, 
       'onSuccess': function(transport) { 

         txtRespuesta = transport.responseText; 

         if (txtRespuesta.lastIndexOf("Error")==-1){ 
          var rutaMin = transport.**responseText**; 
          var accion = ""; 
            var url = "index.src.php?accion=obtener&rutaMin="+rutaMin+"&numF=1";   
          document.getElementById("oculto1").src=url; 
         }else{ 
               ... 

使用RApache的GET變量,我可以在R腳本中使用'autini'。

一個可行的解決方案是將圖像保存在文件中,但我不太喜歡它。 有一些方法可以將位流「讀取」放入「responseText」,然後在php中構建圖像?我應該使用AJAX的極好功能?

感謝您的時間!

+1

也許你應該看'閃亮'? – juba

回答

0

我解決了FastRWeb和Rserve安裝在服務器上的類似問題 在您的html頁面中使用jquery.js傳遞json格式的數據。一個重要的細節,如果使用此解決方案是,如果你試圖獲取與$二進制數據阿賈克斯,你將需要複製的jquery.js和修復2號線在http://bugs.jquery.com/ticket/11461

var myjsondata = '{ "entries": { "Labels": "MyTitle","Order": "1,2,3", "Class": "AM,PM,XF","Hwy": "29,29,31,20,29,26,29,29,24,44,29,26,29,32,49,29,23,24,44,41,29,26,28,29,39,29,28,29,26,26" } }'; 

    var request = $.ajax({   
     url: "http://Rserverip/cgi-bin/R/myboxplot", 
     type: "POST",    
     xhrFields: { 
       responseType : "arraybuffer" 
     }, 
     contentType: "application/x-www-form-urlencoded; charset=UTF-8", 
     dataType: "binary", 
     processData: false, 
     crossDomain : true, 
     data: myjsondata 
     }); 

    request.done(function(msg,ret_status,xhr) { 
     var uInt8Array = new Uint8Array(msg); 
      var i = uInt8Array.length; 
      var binaryString = new Array(i); 
      while (i--) 
      { 
       binaryString[i] = String.fromCharCode(uInt8Array[i]); 
      } 
      var data = binaryString.join(''); 
      var base64 = window.btoa(data); 
      $(img).attr('src', "data:image/png;base64,"+base64); 
     }); 

像解釋在服務器端,您將需要稱爲myboxplot.R帶有R程序(例如)下面的代碼:

run <- function(MyTable) { 
# read json into data frame 
mytmp <- fromJSON(rawToChar(.GlobalEnv$request.body)) 
axes <- sapply(strsplit(json_data[['entries']][['Labels']], ",") , as.character) 
x <- sapply(strsplit(json_data[['entries']][['Class']], ",") , as.character) 
y <- sapply(strsplit(json_data[['entries']][['Hwy']], ",") , as.numeric) 
z <- sapply(strsplit(json_data[['entries']][['Order']], ",") , as.numeric) 
mydata <- data.frame(x,y,z) 
mydata$count <- ave(as.numeric(mydata$x), mydata$x, FUN = length) 
#add the count to the x label 
mydata$x <- factor(do.call(paste, c(mydata[c("count", "x")], sep = "]-"))) 
mydata$x <- paste("[",mydata$x, sep = "") 
#reorder by z which is the order number 
mydata$reord <- reorder(mydata$x, mydata$z) 
p <- WebPlot(1191, 842) # A3 
print(ggplot(mydata, aes(reord,y)) + geom_boxplot (aes(fill=reord), alpha=.25, width=1, outlier.colour = "green") + labs(x = axes[1], y = axes[2]) + scale_fill_discrete(name=axes[3]) + stat_summary(aes(label=sprintf("%.02f",..y..)), fun.y=mean, geom="text", size=3) + theme_bw() + theme(axis.title.x = element_text(face="bold", colour="#990000", size=14, vjust = -1), axis.text.x = element_text(angle=-90, hjust=1, size=12), plot.margin=unit(c(1,1,1.5,1),"lines")) ) 
p 
} 

讀取在何處放置該程序和如何設置FastRWeb的FastRweb文檔。

在服務器端需要更少設置的更簡單的解決方案是使用R websockets包。爲我工作得很好。