2016-07-08 19 views
0

Ich habe eine glänzende App, die ein Streudiagramm basierend auf Benutzereingaben für die Variablen x und y aktualisiert. Ich möchte die Daten für das x und y im Tooltip haben und diese Aktualisierung haben, wenn der Benutzer aktualisiert, was sie auf der x- und y-Achse wollen. Unten ist ein Beispielcode mit 2 von meinem Versuch zu diesem Thema (2. Versuch auskommentiert). Beachten Sie, dass ich den Iris-Datensatz hinzugefügt habe, um jedem Datenpunkt basierend auf seiner Zeilennummer im Datensatz eine eindeutige ID zuzuweisen.Plotdaten in GGVIS-Tooltip anzeigen

#Check packages to use in library 
{ 
library('shiny') #allows for the shiny app to be used 
library('stringr') #string opperator 
library('ggvis') #allows for interactive ploting 
library('dplyr') 
library('RSQLite') 
} 

alldata <- iris 

#adds a column of a unique ID for each row 
alldata$ID <- 1:nrow(alldata) 

# UI 

ui<-fluidPage(
titlePanel("Iris"), 
fluidRow(
column(12, 
     ggvisOutput("plot1") 
), 
column(4, 
     wellPanel(
     h4("Data Variables"), 
     selectInput(inputId = "x", label="Select x-axis Variable:", choices=as.character(names(alldata[,1:4])),selected='Petal.Length', multiple = FALSE), 
     selectInput(inputId = "y", label="Select y-axis Variable:", choices=as.character(names(alldata[,1:4])),selected='Petal.Width', multiple = FALSE) 
     )) 
)) 

#SERVER 
server<-function(input,output,session) 
{ 
# Function for generating tooltip text 
my_tooltip <- function(tt) { 
if (is.null(tt)) return(NULL) 
if (is.null(tt$ID)) return(NULL) 

# Pick out the shot with this ID 
alldata <- isolate(alldata) 
Datapoint <- alldata[alldata$ID == tt$ID, ] 

paste0("<b>", "Species: ", Datapoint$`Species`, 
     "</b><br>", "ID: ", Datapoint$`ID`, 
     "<br>", "X Variable: ", Datapoint$`input$x`, 
     "<br>", "Y Variable: ", Datapoint$`input$y` 
     # "<br>", "X Variable: ", Datapoint %>% `input$x`, 
     # "<br>", "Y Variable: ", Datapoint %>% `input$y` 
) 
} 

vis <- reactive({ 

xvar <- prop("x", as.symbol(input$x)) 
yvar <- prop("y", as.symbol(input$y)) 

p1 = alldata %>% 
    ggvis(x = xvar, y = yvar) %>% 
    layer_points(size.hover := 200, 
       fillOpacity:= 0.5, fillOpacity.hover := 1, 
       fill = ~Species, 
       key := ~ID 
) %>% 

    # Adds the previously defined tool_tip my_tooltip 
    add_tooltip(my_tooltip, "hover") 

    # Specifies the size of the plot 
    # set_options(width = 800, height = 450, duration = 0) 
}) 

#Actually plots the data 
vis %>% bind_shiny("plot1") 
} 

#Run the Shiny App to Display Webpage 
shinyApp(ui=ui, server=server) 

Antwort

1

Eine Option besteht darin, nur die relevanten Spalten innerhalb Ihrer Tooltip-Funktion zu unterteilen und dann alle Werte aus diesem Dataset anzuzeigen.

my_tooltip <- function(tt) { 
     if (is.null(tt)) return(NULL) 
     if (is.null(tt$ID)) return(NULL) 

     Datapoint <- alldata[alldata$ID == tt$ID, c("Species", "ID", input$x, input$y)] 

     paste0(names(Datapoint), ": ", format(Datapoint), collapse = "<br />") 
    } 

Oder benutzen Sie einfach, zum Beispiel input$x direkt, da diese Zeichen sind so einfach aus Datensätzen zu ziehen und als Tooltip Namen verwenden.

my_tooltip <- function(tt) { 
     if (is.null(tt)) return(NULL) 
     if (is.null(tt$ID)) return(NULL) 

     Datapoint = alldata[alldata$ID == tt$ID, ] 

     paste0("<b>", "Species: ", Datapoint$`Species`, 
       "</b><br>", "ID: ", Datapoint$`ID`, 
       "<br>", input$x, ": ", Datapoint[[input$x]], 
       "<br>", input$y, ": ", Datapoint[[input$y]]) 
    } 
+0

Vielen Dank Ich habe nur Ihre 2. Lösung versucht, da es am einfachsten zu implementieren war mit dem, was ich bereits hatte und es funktionierte genau so, wie ich es wollte! – User247365