R Shiny 无法显示 ggplot 图表

R Shiny unable to display ggplot chart

我在显示 ggplot(或 hist() 等任何形式的图表)时遇到问题。我试过查看 Stack Overflow,但提供的解决方案对这个实例没有用。我无法成功显示任何图表。

我正在使用 3.2.0 版本的 R studio,在 Shinyapps.io 上部署并通过 Chrome 查看。我能够在 R 中显示图形,但在 运行 闪亮时无法显示它。

这是代码问题还是我包裹中遗漏了什么? (注意:我已经减少了我的代码以尝试排除故障,因此 ui.R 中的变量未在 server.R 中使用。)

ui.R

library(shiny)
library(ggplot2)

dataset <- diamonds


diamondcolours <- unique( dataset["color"], incomparables = FALSE)    
diamondcolours <- lapply(diamondcolours, as.character)

diamondcuts <- unique( dataset["cut"], incomparables = FALSE)    
diamondcuts <- lapply(diamondcuts, as.character)

diamondclarity <- unique( dataset["clarity"], incomparables = FALSE)    
diamondclarity <- lapply(diamondclarity, as.character)

carat <- dataset["carat"]
mincarat <- min(carat[ carat != min(carat) ])
# mincarat
maxcarat <- max(carat[ carat != max(carat) ])
# maxcarat

fluidPage(

  titlePanel("Diamonds"),

  sidebarPanel(
    sliderInput('carat', 'Carat', min=mincarat, max=maxcarat,
                value=mincarat, step=0.01, round=0),    
    selectInput('cut', 'Cut', diamondcuts$cut),    
    selectInput('color', 'Color', diamondcolours$color),    
    selectInput('clarity', 'Clarity', diamondclarity$clarity)  
  ),

   mainPanel(
    plotOutput(outputId = 'mainplot')
   )
)

server.R

library(shiny)
library(ggplot2)


dataset <- diamonds()

  shinyServer(function(input, output, session) {
    values <- reactiveValues()

    testset <- dataset[ which(dataset$color == values$dcolor & dataset$carat > values$dcarat & dataset$clarity == values$dclarity & dataset$cut== values$dcut ), ]  


  output$mainplot <- renderPlot({

    p <- ggplot(dataset[dataset$price <= 326,], aes(x = carat, y = color))
    p <- p + geom_point()
    print(p)

}  )

该代码中有多个错误:

  1. 您缺少 server.R
  2. 末尾的括号
  3. 您没有正确读取数据

修改后的文件:

library(shiny)
library(ggplot2)
shinyServer(function(input, output, session) {
  data("diamonds")
  dataset <- diamonds
  rm(diamonds)
  values <- reactiveValues()

  testset <- dataset[ which(dataset$color == values$dcolor & dataset$carat > values$dcarat & dataset$clarity == values$dclarity & dataset$cut== values$dcut ), ]


  output$mainplot <- renderPlot({

    p <- ggplot(dataset[dataset$price <= 326,], aes(x = carat, y = color))
    p <- p + geom_point()
    print(p)
  })
})

ui.R也是错误的。根据 Shiny 中范围规则的指导方针,你应该把这些东西放在 global.R 的开头。

一些更重要的问题:(1) 数据应该对用户输入有反应,(2) 引用输入的变量名不正确,(3) UI 中的所有代码都应该是在服务器中,或者,如果它不是反应性的,则在全球环境中。这是运行的简化版本,

library(shiny)
library(ggplot2)
dataset(diamonds)
## ** From UI: variables defined here can be seen in the whole app
mincarat <- min(diamonds$carat)
maxcarat <- max(diamonds$carat)

shinyApp(
  shinyUI(
    fluidPage(
      titlePanel("Diamonds"),
      sidebarPanel(
        sliderInput('dcarat', 'Carat', min=mincarat, max=maxcarat,
                    value=mincarat, step=0.01, round=0),
        selectInput('dcut', 'Cut', levels(diamonds$cut)),
        selectInput('dcolor', 'Color', levels(diamonds$color)),
        selectInput('dclarity', 'Clarity', levels(diamonds$clarity))  
      ),
      mainPanel(
        plotOutput('mainplot')
      )
    )        
  ),

  shinyServer(function(input, output) {
    ## values <- reactiveValues()  # unused
    ## Your data should be reactive - and reference `input` 
    ## to get user-entered values
    rxData <- reactive({
      dat <- with(diamonds, 
           diamonds[color == input$dcolor & 
                      carat > input$dcarat & 
                      clarity == input$dclarity & 
                      cut == input$dcut, ])
      dat
    })

    output$mainplot <- renderPlot({
      dataset <- rxData()  # this is the subsetted data
      p <- ggplot(dataset, aes(x = carat, y = price))
      p <- p + geom_point()
      print(p)
    })
  })
)