【问题标题】:R Shiny: scatter plot not showingR Shiny:散点图未显示
【发布时间】:2020-03-31 22:15:01
【问题描述】:

我正在尝试基于动态滑动条渲染 plot_ly 散点图。但是,似乎我错过了一些东西。

当我运行应用程序时,我看到的错误如下:

错误:第一个参数无效

非常感谢您帮助我们了解问题所在。

请在代码下方找到(希望它现在具有足够的可重复性)。

#load libraries to be used. Pacman ensures library reproducibility 
if (!require("pacman")) install.package("pacman")
pacman::p_load(ggplot2,dplyr,tidyr, rpart, shiny, shinydashboard, plotly, DT)


#load Titanic dataset 
dataset<-read.csv(".../titanic.csv")


ui <- fluidPage(
  dashboardHeader(
    title = "My trial",
    titleWidth = 300
  ),

  dashboardSidebar(
    sidebarMenu(
      sidebarMenu(
        menuItem("Visualization", tabName = "visualization", icon = icon("dashboard")),
        menuItem("Data Table", tabName = "datatable", icon = icon("th"))
      )

    )
  ),

  dashboardBody(
    tabItems(
      # Content of first tab
      tabItem(tabName = "visualization",
              h2("Visualization using Plot_ly"),
              fluidRow(
                box(plotlyOutput("Trialplot")),
                box(
                  title = "Age range",
                  status="primary",
                  solidHeader=TRUE,
                  collapsible=TRUE,
                  sliderInput("slider", "Please select the age range to be seen:", 0, max(dataset$Age), c(0,max(dataset$Age)/2), ticks=FALSE)
                )
              ), 
              box(plotlyOutput("Trialplot"))

      ),

      # Content of second tab
      tabItem(tabName = "datatable",
              h2("Data table")
      )
    )
  )
)


server = shinyServer(function(input, output,session) { 



  output$Trialplot<-renderPlotly({
    dataset_filtered<-dataset[dataset$Age ==input$slider,]
    plot_ly(data = dataset_filtered, x = ~Fare, y = ~get(input$slider) , 
                                  color=~Survived, 
                                  colors=pal, 
                                  type='scatter',
                                  marker=list(size=10),
                                  hoverinfo='text',
                                  text=~paste("Name:",Name,", Age:",Age,", Fare",Fare)
                                  )%>%
                                  layout(title="Age vs.Fare")})

}
)

shinyApp(ui,server)

提前致谢。

【问题讨论】:

  • 现在变量dataset 没有定义,所以它仍然不能重现。
  • 道歉(再次)。修复。感谢您的耐心等待!
  • 这无济于事,因为我们的计算机上没有 CSV 文件。此外,您似乎还包括了一堆与该问题没有直接关系的其他包。也不要每个人都在问题中包含rm(list=ls(all=TRUE)),因为可能会删除试图帮助您的人的数据,而且它(通常也不推荐用于您自己的代码)[tidyverse.org/blog/2017/12/workflow-vs-script/]
  • 感谢 Flick 先生的提示。这是经典的泰坦尼克号数据集。我是否应该尝试使其更具重现性?

标签: r shiny r-plotly


【解决方案1】:

你不应该在你闪亮的应用程序中调用plotlyOutput("Trialplot")两次,而且sliderInput有两个值,即滑块的最小值和最大值,所以你不能使用这样的dataset$Age == input$slider

我试图重现您的代码,现在它对我有用,下次尝试使用 dput(data) 函数的输出发布您的数据。

library(shiny)
pacman::p_load(ggplot2,dplyr,tidyr, rpart, shiny, shinydashboard, plotly, DT)


#load Titanic dataset 
dataset<-read.csv("titanic.csv")


ui <- fluidPage(
  dashboardHeader(
    title = "My trial",
    titleWidth = 300
  ),

  dashboardSidebar(
    sidebarMenu(
      sidebarMenu(
        menuItem("Visualization", tabName = "visualization", icon = icon("dashboard")),
        menuItem("Data Table", tabName = "datatable", icon = icon("th"))
      )

    )
  ),

  dashboardBody(
    tabItems(
      # Content of first tab
      tabItem(tabName = "visualization",
              h2("Visualization using Plot_ly"),
              fluidRow(
                # box(plotlyOutput("Trialplot")),
                box(
                  title = "Age range",
                  status="primary",
                  solidHeader=TRUE,
                  collapsible=TRUE,
                  sliderInput("slider", "Please select the age range to be seen:", 0, max(dataset$Age,na.rm = T), c(0,max(dataset$Age,na.rm = T)/2), ticks=FALSE)
                )
              ), 
              box(plotlyOutput("Trialplot"))

      ),

      # Content of second tab
      tabItem(tabName = "datatable",
              h2("Data table")
      )
    )
  )
)


server = shinyServer(function(input, output,session) { 
  observe({
    print(input$slider)
  })
  output$Trialplot<-renderPlotly({
    dataset_filtered<-dataset[dataset$Age >= input$slider[1] & dataset$Age <= input$slider[2],]
    plot_ly(data = dataset_filtered, x = ~Fare, y = ~Age , 
            color=~Survived, 
            colors=NULL, 
            type='scatter',
            marker=list(size=10),
            hoverinfo='text',
            text=~paste("Name:",Name,", Age:",Age,", Fare",Fare)
    )%>%
      layout(title="Age vs.Fare")
    })

}
)

shinyApp(ui,server)

【讨论】:

  • 有效。非常感谢!