在Shiny,'数据'中编辑反应函数的策略。必须是矢量类型,是' NULL'错误

时间:2017-03-11 03:02:05

标签: r debugging shiny reactive

目标:我正在尝试创建一个闪亮的应用程序,显示(1)非度量多维缩放解决方案的压力图,(2)点配置的ggplot,以及(3)聚类点配置的结果通过绘制点配置和叠加聚类的chull。

问题:前两个图表没有任何困难。而不是第三个情节,我得到错误:'数据'必须是矢量类型,是' NULL'

  1. 我很感激有关如何解决具体问题的任何建议,即"数组错误:'数据'必须是矢量类型,是' NULL'"

  2. 我也很感激有关如何调试闪亮的一般建议。我唯一的策略是将代码视为不是反应性代码,我怀疑这种策略并不是非常有效。

  3. 我尝试解决:我已经搜索了rseek上的错误并且堆栈溢出并查看了帖子。在一些具有类似错误的情况下,问题是没有计算必要的数据。我查看了代码,将其视为普通(非反应)代码,并使用了假数据。当我这样做时,我没有任何问题,所以我认为它是关于反应性的?关于如何调试的问题2是对如下事实的反应:尝试像代码那样调试并不是动态的并不能识别问题。

    可重复的示例:我整理了一个随机生成数据的闪亮应用程序。在进行测试之前,我更新了R和我使用的所有软件包。

    # Packages and options
    library(shiny)
    library(vegan)
    library(cluster)
    library(tidyverse)
    options(digits = 3)
    # Create dissimilarity matrix
    d <- rnorm(1000)
    mat <- matrix(d, ncol = 10)
    diss_m <- daisy(mat) %>% as.matrix()
    # Function
    find_chulls <- function(df, x, y) {
      ch <- chull(df[[x]], df[[y]])
      df[ch,] %>% as.data.frame()
      }
    ui <- fluidPage(
      titlePanel("Research"),
      sidebarLayout(
        sidebarPanel(
          numericInput('dim', 'Dimensions', 2, min = 2, max = 15)
        ),
        mainPanel(
          h3('Stressplot'),
          plotOutput('plot0'),
          h3('Non-Metric Multidimensional Scaling'),
          plotOutput('plot1'),
          h3('2d Density Plot'),
          plotOutput('plot2'),
          h3('Cluster Analysis'),
          plotOutput('plot3')
        )
      )
    )
    server <- function(input, output, session) {
      nmds <- reactive({
        metaMDS(diss_m,
                distance = "euclidean",
                k = input$dim,
                trymax = 200,
                autotransform = FALSE,
                noshare = FALSE,
                wascores = FALSE)
      })
      output$plot0 <- renderPlot({
        stressplot(nmds())
      })
      pts <- reactive({
        nmds()$points %>% as.data.frame()
      })
      output$plot1 <- renderPlot({
        ggplot(pts(), aes(x = MDS1, y = MDS2)) +
          geom_point()
      })
      output$plot2 <- renderPlot({
        ggplot(pts(), aes(x = MDS1, y = MDS2)) +
          geom_point() +
          geom_density2d()
      })
      df_cl <- reactive({
        km <- kmeans(x = pts(), centers = input$clust)
        cl <- km$cluster
        data.frame(pts(), clust = cl)
      })
      df_ch <- reactive({
        df_ch_temp <- df_cl() %>% group_by(clust) %>% do(find_chulls(.,     1, 2))
        df_ch_temp %>% as.data.frame()
      })
    

    下面的图表是不起作用的

      output$plot3 <- renderPlot({
        ggplot(df_ch(), aes(x = MDS1, y = MDS2, fill = as.factor(clust)))     + geom_polygon(alpha = 0.10)
      })
    }
    # Run the application
    shinyApp(ui = ui, server = server)
    

1 个答案:

答案 0 :(得分:1)

您的input$clust未定义:

df_cl <- reactive({
  km <- kmeans(x = pts(), centers = input$clust)
  cl <- km$cluster
  data.frame(pts(), clust = cl)
})

您需要为clust添加输入绑定,例如:

 numericInput('clust', 'Clusters', 2, min = 2, max = 15)

至于调试:我在browser()的顶部添加了df_cl,然后执行停止,您可以检查变量并在终端中运行代码(例如在Rstudio中)。当我运行km <- kmeans(x = pts(), centers = input$clust)时,我收到了您描述的错误,然后可以看到该输入中没有包含clust元素。