目标:我正在尝试创建一个闪亮的应用程序,显示(1)非度量多维缩放解决方案的压力图,(2)点配置的ggplot,以及(3)聚类点配置的结果通过绘制点配置和叠加聚类的chull。
问题:前两个图表没有任何困难。而不是第三个情节,我得到错误:'数据'必须是矢量类型,是' NULL'
我很感激有关如何解决具体问题的任何建议,即"数组错误:'数据'必须是矢量类型,是' NULL'"
我也很感激有关如何调试闪亮的一般建议。我唯一的策略是将代码视为不是反应性代码,我怀疑这种策略并不是非常有效。
我尝试解决:我已经搜索了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)
答案 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元素。