ggplotly没有适用于' plotly_build'应用于类的对象" NULL"如果声明

时间:2016-08-03 16:29:48

标签: r ggplot2 shiny plotly shinydashboard

在使用条件语句时,将图形集成到闪亮的仪表板中并遇到错误。我尝试使用' if'来切换图表。 selectInput的语句。我已经使用了circlize包和ggplot图而没有问题,但是当试图用它时,我得到以下错误:

UseMethod中的错误:没有适用于' plotly_build'应用于类" NULL"

的对象

我在这里找到了一个类似问题的帖子,但没有完全回答我的具体问题:

Convert ggplot object to plotly in shiny application

以下是使用与上述帖子中使用的代码类似的代码的示例,但经过修改以显示我要查看的内容以及不断弹出的错误:

library(shiny)
library(ggplot2)
library(ggthemes)
library(plotly)
ui = dashboardPage(
    dashboardHeader(title = 'sample'),
    dashboardSidebar(), ##Body content dashboardBody(
        fluidRow(
            box(background = "green", selectInput(inputId = "dimension",
                label = strong("Choose Metric"),
                choices = c('choice' = '1', 'choice2' = '2'),
                multiple = FALSE, selectize = TRUE)),

            box(plotlyOutput(outputId = 'plot2')))
    ))

server < - function(input, output) {

    output$plot2 < -renderPlotly({
        print(
            ggplotly(
                ggplot(data = mtcars, aes(x = disp, y = cyl)) + geom_smooth(method =
                    lm, formula = y~x) + geom_point() + theme_gdocs()))

        if (input$dimension == '2') {
            print(
                ggplotly(
                    ggplot(data = mtcars, aes(x = hp, y = cyl)) + geom_smooth(method =
                        lm, formula = y~x) + geom_point() + theme_gdocs()))

        }
    })
}

shinyApp(ui, server)

我还在学习,所以我确定这个简单的错误让我无法逃避,但我不确定它可能是什么。感谢帮助!

1 个答案:

答案 0 :(得分:2)

很快,问题是如果input$dimension'1'则没有返回值。你正在打印出情节,但R又向前走了一步,检查是否符合条件。有几种方法可以正确编码。

您可以将图存储在对象中,比如res,如果条件满足,请用新图标覆盖它,最后在函数末尾返回它 - 请参阅下面的示例。您也可以使用else语句。

library(shiny)
library(shinydashboard)
library(ggplot2)
library(ggthemes)
library(plotly)

ui = dashboardPage(
  dashboardHeader(title = 'sample') ,
  dashboardSidebar(),
  ## Body content
  dashboardBody(
    fluidRow(
      box(background="green", selectInput(inputId = "dimension", 
                                          label = strong("Choose Metric"),
                                          choices = c('choice'='1','choice2'='2'), 
                                          multiple = FALSE, selectize = TRUE)),

      box(plotlyOutput(outputId = 'plot2')))
  ))

server <- function(input, output) {

  output$plot2 <- renderPlotly({

    res <- ggplotly(
              ggplot(data = mtcars, aes(x = disp, y = cyl)) + 
                geom_smooth(method = lm, formula = y ~ x) + 
                geom_point() + 
                theme_gdocs())


    if (input$dimension == '2') {

      res <- ggplotly(
                ggplot(data = mtcars, aes(x = hp, y = cyl)) +  
                  geom_smooth(method = lm, formula = y ~ x) + 
                  geom_point() + 
                  theme_gdocs())
    }
    res
  })
}

shinyApp(ui, server)