在JavaScript中检索R对象属性

5 javascript r onrender plotly htmlwidgets

我有一个包含100个观测值的双变量数据集.我使用了六边形装箱,结果是26个六边形箱.为了保存26个六边形箱中每个的100个观测值的行,我使用了base::attrR中的函数.在下面的代码中,这是在以下位置完成的:

attr(hexdf, "cID") <- h@cID
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建Plotly六边形分箱的交互式R 对象,以便如果用户点击给定的六边形分区,它们将获得分组到该分区中的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 = h@cell, counts = h@count)
attr(hexdf, "cID") <- h@cID
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)
Run Code Online (Sandbox Code Playgroud)

当我运行此代码并在Web浏览器中打开它时,我获得了如下的交互式图表(绿色框不在图中;为了说明目的而叠加):

在此输入图像描述

如果我点击绿色框内的六边形,则将hexID40和counts3 的正确值打印到控制台.此时,我想获得放入该六边形bin的原始数据框的3行.

我知道如何使用该函数在R的onRender()函数外部执行此操作.例如,我可以执行以下操作:htmlwidgetsbase::attr

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

并收到以下正确的3个数据点,这些数据点放入我点击的垃圾箱中:

     ID         A        B
47 ID47 0.3645820 2.087167
66 ID66 0.1887923 2.206102
71 ID71 0.4755095 2.307978
Run Code Online (Sandbox Code Playgroud)

我正在使用比这个MWE更大的数据集.出于这个原因,我使用该base:attr函数的目的是防止更大的数据帧浮动.但是,我不确定如何翻译函数的base::attr功能,以便我可以访问onRender()JavaScript代码中单击的六边形框中出现的相应数据点行.我确实将pS$data对象包含在onRender()JavaScript代码中,但仍然卡住了.

任何建议都将真诚地感谢!

Nic*_*icE 1

您可以添加一列,该列的每一行都有其在 bindata 中所属的 hexbin 的 ID:

bindata$hex <- h@cID
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其传递给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)
Run Code Online (Sandbox Code Playgroud)