2013-02-05 5 views
0

RApache에서 R 환경을 사용하는 웹 응용 프로그램에서 작업하고 있습니다. AJAX.updater 함수를 사용하여 R 스크립트에 몇 개의 변수를 보내면 브라우저에 ResponseText가 표시됩니다. 문제는 없지만 이제는 그래프를 그려주는 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{ 
               ... 
을 내가 예를 들어 해당 스크립트와 R하여 브라우저에서 그려진 이미지를 표시 할 수있어

RApache의 GET 변수를 사용하면 R 스크립트에서 'autini'를 사용할 수 있습니다.

하나의 확실한 해결책은 이미지를 파일로 저장하는 것이지만,별로 좋아하지 않습니다. "readbin"에서 읽은 비트 스트림을 "responseText"에 넣고 PHP로 이미지를 빌드하는 방법이 있습니까? 내가 사용해야하는 AJAX의 기능은 무엇입니까?

감사합니다!

+1

'반짝 반짝 빛나는'을보아야할까요? – juba

답변

0

서버에 설치된 FastRWeb 및 Rserve와 유사한 문제가 jquery.js를 사용하여 html 페이지에서 이와 같이 json 형식 데이터를 전달합니다. 한 가지 중요한 세부 사항이 솔루션을 사용하면 당신은 $ 이진 데이터를 검색하려고 할 경우 등이 서버 측에서 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); 
     }); 

설명이 개 라인을 jquery.js를 복사하고 수정해야합니다 아약스이다, 당신이 필요합니다 와 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 서버의 웹 소켓 패키지를 사용하면 서버 측에서 설정하는 것이 훨씬 쉬운 간단한 솔루션입니다. 나를 위해 잘 일했다.

관련 문제