2017-02-22 7 views
6

में आर ऑब्जेक्ट विशेषताओं को पुनर्प्राप्त करना मेरे पास 100 अवलोकनों के साथ एक बिवाएरेट डेटासेट है। मैंने षट्भुज का उपयोग किया और 26 हेक्सागोन डिब्बे के साथ समाप्त हो गया। आदेश है कि 26 षट्भुज डिब्बे में से प्रत्येक में हैं 100 टिप्पणियों की पंक्तियों बचाने के लिए, मैं आर में base::attr समारोह इस्तेमाल किया नीचे कोड में, इस पर किया जाता है:जावास्क्रिप्ट

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

मैं बनाने के लिए कोशिश कर रहा हूँ हेक्सागोन बिनिंग के एक इंटरैक्टिव आर Plotly ऑब्जेक्ट ताकि अगर कोई उपयोगकर्ता दिए गए हेक्सागोन बिन पर क्लिक करना था, तो वे उस बिन में समूहीकृत 100 अवलोकनों की पंक्तियां प्राप्त करेंगे। मेरे पास इस लक्ष्य का हिस्सा पूरा हुआ है। मेरे मेगावाट के नीचे है:

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

अगर मैं हरे बॉक्स के अंदर षट्भुज पर क्लिक करें, 40 की सही hexID और 3 के counts कंसोल के लिए मुद्रित कर रहे हैं। इस बिंदु पर, मैं उस मूल डेटा फ्रेम की 3 पंक्तियां प्राप्त करना चाहता हूं जिन्हें हेक्सागोन बिन में रखा गया था।

मुझे पता है कि onRender()htmlwidgets पैकेज के base::attr फ़ंक्शन का उपयोग करके 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() जावास्क्रिप्ट कोड में क्लिक किए गए हेक्सागोन बिन में होने वाली उपयुक्त डेटा पॉइंट पंक्तियों तक पहुंच सकूं। मैंने pS$data ऑब्जेक्ट को onRender() जावास्क्रिप्ट कोड में शामिल किया था, लेकिन अभी भी अटक गया हूं।

किसी भी सलाह की ईमानदारी से सराहना की जाएगी!

उत्तर

2

आप एक स्तंभ जो प्रत्येक पंक्ति के लिए hexbin की आईडी यह आपके bindata में के अंतर्गत आता है है जोड़ सकते हैं:

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

सहायता के लिए धन्यवाद! मुझे एहसास है कि मुझे दूरदर्शिता की कमी है और मेरे एमडब्ल्यूई को ओवरम्प्लिफाइड किया गया है ताकि एक समाधान (जैसा कि आपने दिखाया) है जिसके लिए आधार :: attr() का उपयोग करने की आवश्यकता नहीं है। समाधान अभी भी मेरे और दूसरों के लिए सहायक हो सकता है। मैंने अभी एक बेहतर MWE लिखा है जो मुझे आशा है कि मैं स्पष्ट रूप से आधार :: attr() के साथ क्यों अटक गया हूं और मुझे नहीं लगता कि यहां समाधान उस मामले के लिए क्यों काम करेगा। मैंने इसे एक भाग 2 संस्करण में पोस्ट किया है (http://stackoverflow.com/questions/42460061/retrieving-r-object-attributes-in-javascript-part-2)। धन्यवाद। – luckButtered

+1

मेरे पास एक ही रणनीति भाग 2 के लिए काम करेगी, मैंने एक समाधान पोस्ट किया है जो उम्मीद है कि आपके पूर्ण उदाहरण पर काम करेगा। – NicE

संबंधित मुद्दे