0

私はRApacheでR環境を使用するWebアプリケーションに取り組んでいます。AJAX.updater関数を使用していくつかの変数をRスクリプトに送信すると、ブラウザーにResponseTextが返され表示されます。問題はありませんが、グラフをプロットする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」を操作できます。

考えられる解決策の1つは、画像をファイルに保存することですが、私はそれがあまり好きではありません。「 readbin 」で読み取ったビットストリームを「responseText」に入れて、phpで画像を作成する方法ありますか?AJAXのWich関数を使用する必要がありますか?

御時間ありがとうございます!

4

1 に答える 1

0

jquery.jsを使用して、htmlページでこのようなjson形式のデータを渡すサーバーにインストールされたFastRWebとRserveで同様の問題を解決しました。このソリューションを使用する場合の重要な詳細の 1 つは、$.ajax を使用してバイナリ データを取得しようとすると、jquery.js をコピーして、http://bugs.jquery.com/ticket/11461 で説明されているように 2 行を修正する必要があることです

  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 パッケージを使用することです。私にとってはうまくいきました。

于 2013-02-05T15:18:42.570 に答える