如何将用户在 flexdashboard shiny 中的输入作为集群的数量到 r 中的 运行 kmeans?

How to take userinput in flexdashboard shiny as number of cluster to run kmeans in r?

我是 shiny/flexdashboard 的新手,到目前为止,我已经能够 渲染 绘图并使用来自selectInputreq(input$user_input_value) 的帮助下。

问题: 至 运行 kmeans 我正在接受 用户输入 用于 号码集群,我无法以反应格式对其进行编码并出现错误:闭包类型的对象不是子集

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(tidyverse)
library(tidytext)
library(scales)
library(glue)
library(widyr)
library(factoextra)
```

df

                               1            2           3            4
Angola               -0.08260540  0.034325891 -0.02013353 -0.014063951
Armenia              -0.06613693 -0.044308626 -0.13230387 -0.024534033
Azerbaijan           -0.07562365 -0.003670707  0.05886792 -0.219660410
Bahrain              -0.08275891  0.035843793 -0.02280102 -0.008044934
Bangladesh           -0.08306371  0.032998297 -0.02634819 -0.017627316
Bosnia & Herzegovina -0.06303898 -0.050781511 -0.15183954  0.016794674

(注意:我已将 csv 文件放在 github 中并在下面提到了它的 link。对于 kmeans,字符列应用作代表 country 这里。)

已更新 df 创建步骤

svd_dimen_all_wide <- read.csv(url("https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/svd_dimen_all_wide.csv"))

svd_dimen_all_wide <- as.data.frame(svd_dimen_all_wide)

rownames(svd_dimen_all_wide) <- svd_dimen_all_wide$X

svd_dimen_all_wide <- svd_dimen_all_wide[,2:ncol(svd_dimen_all_wide)]

flexdashboard

---
title: "UN Country Votes"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
    theme: space
runtime: shiny
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(tidyverse)
library(tidytext)
library(scales)
library(glue)
library(widyr)
library(factoextra)
Page NAme 
=====================================



Inputs {.sidebar}
-----------------------------------------------------------------------


```{r}
  selectInput("number_of_clusters", label = h3("Number of Clusters"), 
      choices = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) , 
                selected = 6)
```


Column {data-width=1000}
-----------------------------------------------------------------------

```{r include=FALSE}
set.seed(123)

km.res <- reactive({
  
      # req(input$number_of_clusters)                
  
      kmeans(svd_dimen_all_wide, as.numeric(input$number_of_clusters), nstart = 25)
    })

      df_with_cluster <- cbind(svd_dimen_all_wide, cluster = km.res$cluster)

      df_with_cluster <- rownames_to_column(df_with_cluster, "country")

      df_with_cluster <- df_with_cluster %>% 
       select(country, cluster, everything())
```

更新的尝试:


renderPrint({
  df_with_cluster <- cbind(svd_dimen_all_wide, cluster = km.res()$cluster)
  
  df_with_cluster <- rownames_to_column(df_with_cluster, "country")

  df_with_cluster <- df_with_cluster %>%
                      select(country, cluster, everything())
  
  head(df_with_cluster)
})
### Comparison of Countries on Yes% of Bi Words

```{r}
renderPlot({
  world_data %>%
  left_join((df_with_cluster %>%
               mutate(country_code = countrycode(country, "country.name", "iso2c"))
             ),
            by = c("country_code")) %>%
  filter(!is.na(cluster)) %>%
  ggplot(aes(x = long, y = lat, group = group,
             fill = as.factor(cluster))) +
  geom_polygon() +
  theme_map() +
  scale_fill_discrete() +
  labs(fill = "cluster",
       title = "World Clusters based on UN voting",
       caption = "created by ViSa") +
  theme(plot.title = element_text(face = "bold", size = 16))
}) 
```

问题出在反应块中。反应式表达式 km.res 使用输入的簇数,运行模型并保存输出。 (让我们在这里结束代码块)。

接下来,决定要对输出做什么?

  • 要打印结果,使用 renderPrint
  • 要显示为绘图,请使用 renderPlot,
  • 显示为 table、用户渲染表等

现在让我们使用 renderPrint() 打印模型的输出,可以通过调用表达式名称后跟括号来访问输出,例如 km.res()

   Column {data-width=1000}
    -----------------------------------------------------------------------
    
    ```{r include=FALSE}
    
    km.res <- reactive({
      
          req(input$number_of_clusters)
      
          set.seed(123)
      
          kmeans(svd_dimen_all_wide, as.numeric(input$number_of_clusters), nstart = 25)
        })
     ```



###

```{r model}
renderPrint({

df_with_cluster <- cbind(svd_dimen_all_wide, cluster = km.res()$cluster)
head(df_with_cluster)

})
```

这是我的博客post与这个问题非常相关https://towardsdatascience.com/build-an-interactive-machine-learning-model-with-shiny-and-flexdashboard-6d76f59a37f9?sk=922526470699966c3f47b24843404a15