私は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)
が、私は以下のようなインタラクティブなプロットを得る(緑色のボックスは、プロットではありません。それは、説明の目的のために重畳しています):
緑色のボックス内の六角形に私をクリックすると、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コードに含めましたが、まだまだ立ち往生しています。
アドバイスをいただければ幸いです!
ありがとうございます!先見の明がなく、私のMWEを単純化して、base :: attr()の使用を必要としないソリューション(あなたが示したように)が存在することを認識しています。このソリューションは、私と他の人にとってまだ役立つことがあります。私はちょうど私がbase :: attr()でまだ立ち往生しているのをなぜより鮮明に示してほしいと思っています、そして、なぜ私はここの解決策がその場合にはうまくいかないと思うか、より良いMWEを書きました。私は第2版(http://stackoverflow.com/questions/42460061/retrieving-r-object-attributes-in-javascript-part-2)に掲載しました。ありがとうございました。 – luckButtered
パート2で同じ戦略を実行することができました。完全な例でうまく機能するソリューションを投稿しました。 – NicE