2017-02-22 6 views
6

私は100の観測値を持つ二変量データセットを持っています。私は六角形のビニングを使用し、26の六角形のビンで終わった。私が作成しようとしていますJavaScriptでRオブジェクトの属性を取得する

attr(hexdf, "cID") <- [email protected] 

:26個の六角ビンのそれぞれにある100個の観測値の行を節約するために、私は以下のコードではR.でbase::attr機能を使用し、これはで行われます対話式のR Plotlyの六角形ビニングのオブジェクトで、ある六角形のビンをクリックすると、そのビンにグループ化された100個の観測の行が取得されます。私はこの目標の一部を完成させました。私のMWEは以下の通りです:私はこのコードを実行すると、Webブラウザでそれを開くと

library(plotly) 
library(data.table) 
library(GGally) 
library(hexbin) 
library(htmlwidgets) 

set.seed(1) 
bindata <- data.frame(ID = paste0("ID",1:100), A=rnorm(100), B=rnorm(100)) 
bindata$ID <- as.character(bindata$ID) 

x = bindata[,c("A")] 
y = bindata[,c("B")] 
h <- hexbin(x=x, y=y, xbins=5, shape=1, IDs=TRUE) 
hexdf <- data.frame (hcell2xy (h), hexID = [email protected], counts = [email protected]) 
attr(hexdf, "cID") <- [email protected] 
pS <- ggplot(hexdf, aes(x=x, y=y, fill = counts, hexID=hexID)) + geom_hex(stat="identity") 

ggPS <- ggplotly(pS) 

myLength <- length(ggPS[["x"]][["data"]]) 
for (i in 1:myLength){ 
    item =ggPS[["x"]][["data"]][[i]]$text[1] 
    if (!is.null(item)) 
    if (!startsWith(item, "co")){ 
     ggPS[["x"]][["data"]][[i]]$hoverinfo <- "none" 
    } 
} 

ggPS %>% onRender(" 
      function(el, x, data) { 
      //console.log(el) 
      //console.log(x) 
      //console.log(data) 

      myGraph = document.getElementById(el.id); 
      el.on('plotly_click', function(e) { 

      cN = e.points[0].curveNumber 
      split1 = (x.data[cN].text).split(' ') 
      hexID = (x.data[cN].text).split(' ')[2] 
      counts = split1[1].split('<')[0] 
      console.log(hexID) 
      console.log(counts) 

      })} 
      ", data = pS$data) 

が、私は以下のようなインタラクティブなプロットを得る(緑色のボックスは、プロットではありません。それは、説明の目的のために重畳しています):

enter image description here

緑色のボックス内の六角形に私をクリックすると、3の40とcountsの正しいhexIDがコンソールに出力されます。この時点で、その六角形のビンに入れられた元のデータフレームの3行を取得したいと思います。

機能を使用してhtmlwidgetsパッケージのonRender()機能の外でRでこれを行う方法を知っています。例えば、私は、次の操作を実行できます。

hexID=40 
obsns <- which(attr(pS$data, "cID")==hexID) 
dat <- bindata[obsns,] 

そして、私はをクリックしたそのビンに入れ、次の正しい3のデータポイント受け取る:

 ID   A  B 
47 ID47 0.3645820 2.087167 
66 ID66 0.1887923 2.206102 
71 ID71 0.4755095 2.307978 

を私はよりもはるかに大きなデータセットで作業していますこのMWE。そのため、base:attr機能を使用する私の意図は、より大きなデータフレームが浮かび上がるのを防ぐことでした。しかし、base::attr関数の機能をどのように翻訳するかはわかりませんので、onRender() JavaScriptコードのクリックした六角形のビン内にある適切なデータポイントの行にアクセスすることができます。私はpS$dataオブジェクトをonRender() JavaScriptコードに含めましたが、まだまだ立ち往生しています。

アドバイスをいただければ幸いです!

答えて

2

あなたは行ごとに、それはあなたのBINDATA内に属しhexbinのIDを持つ列を追加することができます。ユーザーがクリックしたときに

bindata$hex <- [email protected] 

その後、onRender機能とフィルタ行にそれを渡すことができます六角:

ggPS %>% onRender(" 
        function(el, x, data) { 
        myGraph = document.getElementById(el.id); 
        el.on('plotly_click', function(e) { 

        cN = e.points[0].curveNumber 
        split1 = (x.data[cN].text).split(' ') 
        hexID = (x.data[cN].text).split(' ')[2] 
        counts = split1[1].split('<')[0] 

        var selected_rows = []; 

        data.forEach(function(row){ 
        if(row.hex==hexID) selected_rows.push(row); 
        }); 
        console.log(selected_rows); 

        })} 
        ", data = bindata) 
+0

ありがとうございます!先見の明がなく、私のMWEを単純化して、base :: attr()の使用を必要としないソリューション(あなたが示したように)が存在することを認識しています。このソリューションは、私と他の人にとってまだ役立つことがあります。私はちょうど私がbase :: attr()でまだ立ち往生しているのをなぜより鮮明に示してほしいと思っています、そして、なぜ私はここの解決策がその場合にはうまくいかないと思うか、より良いMWEを書きました。私は第2版(http://stackoverflow.com/questions/42460061/retrieving-r-object-attributes-in-javascript-part-2)に掲載しました。ありがとうございました。 – luckButtered

+1

パート2で同じ戦略を実行することができました。完全な例でうまく機能するソリューションを投稿しました。 – NicE

関連する問題