我有一个包含100个观察值的双变量数据集。我使用六边形分档,最后有26个六角形分档。为了保存在每个26个六边形箱的100个观测的行,我在河中使用的base::attr
功能在下面的代码,这是在做:在JavaScript中检索R对象属性
attr(hexdf, "cID") <- [email protected]
我想创建一个交互式的六边形装箱的对象,以便如果用户点击给定的六角仓,他们将获得分组到该仓中的100个观测值的行。我完成了这个目标的一部分。我MWE低于:
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)
当我运行此代码,并在Web浏览器中打开它,我得到一个互动的情节像下面(绿框是不是阴谋,它是叠加为了便于说明):
如果我点击绿色的盒子内的六边形,40个正确hexID
和3 counts
打印到控制台。在这一点上,我想获得放入该六边形箱的原始数据框的3行。
我知道如何使用base::attr
函数在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代码中单击的六边形区域中出现的相应数据点行。我确实在onRender()
JavaScript代码中包含了pS$data
对象,但我仍然卡住了。
任何意见将真诚感谢!
谢谢你的帮助!我意识到我缺乏远见,并且过分简化了我的MWE,因此有一种解决方案(如您所示)不需要使用base :: attr()。该解决方案对我和其他人仍然有帮助。我只写了一个更好的MWE,希望更清楚地表明为什么我仍然坚持使用base :: attr(),并且为什么我不认为这里的解决方案适用于这种情况。我张贴在第2部分版本(http://stackoverflow.com/questions/42460061/retrieving-r-object-attributes-in-javascript-part-2)。谢谢。 – luckButtered
我有同样的策略可以用于第2部分,我已经发布了一个解决方案,希望在您的完整示例中有效。 – NicE