1

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

问题:前两个情节没有困难。而不是第三个情节,我得到错误:“数据”必须是矢量类型,是“空”

  1. 我将不胜感激有关如何解决特定问题的任何建议,即“数组中的错误:'数据'必须是向量类型,是'NULL'”

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

我试图解决的问题:我搜索了 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)
4

1 回答 1

1

input$clust在以下位置未定义:

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

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

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

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

于 2017-03-11T12:50:24.577 回答