【问题标题】:Rewrite reactive dataset in R Shiny在 R Shiny 中重写响应式数据集
【发布时间】:2022-01-28 22:29:30
【问题描述】:

我对反应式数据集有疑问。我使用 eventReactive() 来更改反应数据集 df1 中的列数据类型。它工作正常。列数据类型已更改的新数据集为 modified_df1。但是现在,当我想更改另一列中的数据类型时,之前的更改将被重置。这是因为在更改之前我仍然使用 df1 作为主要数据框。有没有办法在第二个数据类型更改之前重写 df1

 df1 <- reactive({
      req(input$file1)
      df <- read.csv(input$file1$datapath,
                     header = input$header,
                    sep = input$sep,
                    quote = input$quote)
     df
   })
   
   
   colnames <- reactive({ 
     names(df1()) })
   
   observeEvent(df1(), {
     updateCheckboxGroupInput(session, "class_var",
                              label = "Select Columns",
                              choices = colnames(),
                              selected = "") 
   })

 modified_df1 <- eventReactive(input$chg_class, {
     if (input$choose_class == "Numeric") {
       var <- df1() %>% mutate(across(all_of(input$class_var), ~ as.numeric(.)))
     } else if (input$choose_class == "Factor") {
       var <- df1() %>% mutate(across(all_of(input$class_var), ~ as.factor(.)))
     } else if (input$choose_class == "Character") {
       var <- df1() %>% mutate(across(all_of(input$class_var), ~ as.character(.)))
     } else if (input$choose_class == "Date") {
       var <- df1() %>% mutate(across(all_of(input$class_var), ~ as.Date(.)))
     }else if (input$choose_class == "Integer") {
       var <- df1() %>% mutate(across(all_of(input$class_var), ~ as.integer(.)))
     }
   })

【问题讨论】:

  • 与您的问题无关:您可以使用myfun &lt;- switch(input$choose_class, "Numeric" = as.numeric, "Factor" = as.factor, ... 等重写您的代码,然后在across 中使用myfun。关于您的问题,最好有一个最小的可重现示例。查看df1 在工作应用程序中的创建位置和方式等。

标签: r shiny shiny-server shiny-reactivity


【解决方案1】:

不确定我的回答是否合适,因为您没有提供很多信息。

我将只使用一个反应数据帧df1,但不使用反应导体,而是使用反应值:

df1 <- reactiveVal(original_dataframe)

然后我会用观察者修改它:

observeEvent(input$chg_class, {
     if (input$choose_class == "Numeric") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.numeric(.))))
     } else if (input$choose_class == "Factor") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.factor(.))))
     } else if (input$choose_class == "Character") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.character(.))))
     } else if (input$choose_class == "Date") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.Date(.))))
     }else if (input$choose_class == "Integer") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.integer(.))))
     }
   })

编辑

df1 <- reactiveVal()

observeEvent(input$file1, {
     df <- read.csv(input$file1$datapath,
                    header = input$header,
                    sep = input$sep,
                    quote = input$quote)
     df1(df)
})
   
observeEvent(df1(), {
     updateCheckboxGroupInput(session, "class_var",
                              label = "Select Columns",
                              choices = names(df1()),
                              selected = "") 
})

observeEvent(input$chg_class, {
     if (input$choose_class == "Numeric") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.numeric(.))))
     } else if (input$choose_class == "Factor") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.factor(.))))
     } else if (input$choose_class == "Character") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.character(.))))
     } else if (input$choose_class == "Date") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.Date(.))))
     }else if (input$choose_class == "Integer") {
       df1(df1() %>% mutate(across(all_of(input$class_var), ~ as.integer(.))))
     }
})

【讨论】:

  • 谢谢,df1() 是我从闪亮的应用程序中上传的数据帧。我编辑我的问题并添加我如何获得 df1()。
  • 所以在那一刻,它不适用于您的答案。 @Stéphane Laurent
  • @Marquee 查看我的编辑。
  • 现在可以使用了,非常感谢。
猜你喜欢
  • 2019-12-19
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2020-12-26
  • 2021-03-02
  • 2020-01-04
  • 2018-02-13
  • 1970-01-01
相关资源
最近更新 更多