2017-05-21 1 views
3

Ich bin dabei, 3D-interaktive Plots in meine glänzende App zu implementieren, und bisher habe ich Plotly verwendet. Allerdings hat plotly einen großen Nachteil, es ist extrem langsam beim Rendern. Ich habe Prüfungen durchgeführt, und die gesamte Erstellung der aktualisierten outplot $ plot < - renderPlotly ({.....}) und plotlyOutput ("Plot") dauert weniger als 0,5 Sekunden, trotz der großen Datenmenge beteiligt. Dies ist seit Jahren bekannt, scheint aber immer noch aktuell zu sein.Rendern von Scatter3d in glänzende Seite anstelle von Popup

Daher suche ich ein Paket namens Auto, auch weil es viele Optionen hat, einige, die ich besonders möchte, die nicht in anderen Paketen verfügbar sind. Info über das Auto-Paket ist hier: http://www.sthda.com/english/wiki/amazing-interactive-3d-scatter-plots-r-software-and-data-visualization Das Problem ist, dass es in einem rendert separate Popup-Fenster statt in der glänzenden App, und ich möchte es in sich haben, oder noch besser, fügen Sie eine Schaltfläche, die dem Benutzer es als Popup haben können, aber nur wenn gefragt. Jedoch kann ich nicht herausfinden, wie man den Bugger in die wirklich glänzende Seite einmischt.

Hier ist mein minimales Beispiel mit einem einzelnen Textelement und dem Grafikcode, der (in meinem Fall) in einem separaten Fenster statt in der App erscheint.

install.packages(c("rgl", "car", "shiny")) 

library("rgl") 
library("car") 
library(shiny) 

cars$time <- cars$dist/cars$speed 


ui <- fluidPage(
    hr("how do we get the plot inside this app window rather than in a popup?"), 

    plotOutput("plot", width = 800, height = 600) 
) 


server <- (function(input, output) { 


    output$plot <- renderPlot({ 
    scatter3d(x=cars$speed, y=cars$dist, z=cars$time, surface=FALSE, ellipsoid = TRUE) 
    }) 
}) 


shinyApp(ui = ui, server = server) 

Es gibt auch dieses Paket, scatterplot3d aber das ist nicht interaktiv http://www.sthda.com/english/wiki/scatterplot3d-3d-graphics-r-software-and-data-visualization

Und es gibt einige RGL-Pakete, aber sie haben das gleiche Problem (separates Fenster) und bieten nicht die Optionen, nach denen ich suche.

Antwort

4

Sie müssen eine rglwidget verwenden, die das letzte rgl Plot nimmt und in eine htmlwidget steckt. Es war einmal in einem separaten Paket, aber es wurde kürzlich in `rgl integriert.

Hier ist der Code, dies zu tun:

library(rgl) 
library(car) 
library(shiny) 

cars$time <- cars$dist/cars$speed 

ui <- fluidPage(
    hr("how do we get the plot inside this app window rather than in a popup?"), 

    rglwidgetOutput("plot", width = 800, height = 600) 
) 

server <- (function(input, output) { 

    output$plot <- renderRglwidget({ 
    rgl.open(useNULL=T) 
    scatter3d(x=cars$speed, y=cars$dist, z=cars$time, surface=FALSE, ellipsoid = TRUE) 
    rglwidget() 
    }) 
}) 
shinyApp(ui = ui, server = server) 

dieses Nachgeben:

enter image description here

+0

Hey Mike, danke! Ich habe nur einen WebGL-Wrapper für rgl gefunden, der am Ende die Copyrightinformation gedruckt hat, anstatt eine Handlung, haha. Das funktioniert, aber jetzt bekomme ich ein Popup AND Embedded Plot. Hat es das auch für dich getan? Wenn nicht. Wie mache ich mein Popup-Stop? Vielen Dank ! – Mark

+0

Okay, das auch behoben. Versuch es. Wenn es klappt wäre ein upvote wert :) –

+0

Eigentlich schaue ich mir das noch an. Denke, es kann viel einfacher sein. –

Verwandte Themen