我有一個包含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