【问题标题】:How to create column repeatedly in shiny reactive data?如何在闪亮的反应数据中重复创建列?
【发布时间】:2020-09-06 16:43:31
【问题描述】:

我想在输入csv文件中创建列,但是由于reactive的特性, 我只能在输入文件中创建一个新列。

这是我的代码。

 library(shiny)
library(rlang)
library(dplyr)
    
    ui <- fluidPage(
  fileInput("file","csv file", accept = c(".csv")),
  textInput("name","Variable name"),
  selectInput("sel","Variable selection", choices = colnames(file), multiple = T),
  actionButton("go","Go"),
  actionButton("mean","Mean"),
  dataTableOutput("DF")
)


server <- function(input, output, session) {
 
  appdata <- reactive({
    read.csv(input$file$datapath, header=TRUE, stringsAsFactors = FALSE, sep = ",",
             fileEncoding = "euc-kr") 
  })

  
  
  observeEvent(input$file,{
    
    output$DF <- renderDataTable({
      appdata()
    })
    updateSelectInput(session, "sel", label = "Variable", choices = colnames(appdata()))
  })
  
  
  observeEvent(input$mean,{
    rv <- reactiveValues(data=NULL)
    rv$data <- appdata()
    
    df <- eventReactive(input$mean,{
      req(input$mean, input$sel, input$name)
      var_name <- input$name
      mydf <- rv$data
      new_var <- mydf %>% transmute(!!var_name := rowMeans(select(., input$sel)))
      rv$data <- cbind(mydf, new_var)
    })
    output$DF <- renderDataTable({
      df()
      })
  })
      
 
}

shinyApp(ui, server)

如您所见,appdata 是我放入闪亮服务器的reactive。 这就是为什么我忍不住把rv$data &lt;- appdata() 放在observeEvent() 中。

有没有办法在反应数据中创建新列? 提前致谢。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    试试:

    library(shiny)
    library(rlang)
    library(dplyr)
    
    ui <- fluidPage(
      fileInput("file","csv file", accept = c(".csv")),
      textInput("name","Variable name"),
      selectInput("sel","Variable selection", choices = colnames(file), multiple = T),
      actionButton("go","Go"),
      actionButton("mean","Mean"),
      dataTableOutput("DF")
    )
    
    
    server <- function(input, output, session) {
      rv <- reactiveValues(data=NULL)
    
      observeEvent(input$file,{
        rv$data <- read.csv(input$file$datapath, header=TRUE, stringsAsFactors = FALSE, sep = ",",
                            fileEncoding = "euc-kr") 
        output$DF <- renderDataTable({
          rv$data
        })
        updateSelectInput(session, "sel", label = "Variable", choices = colnames(rv$data))
      })
    
    observeEvent(input$mean,{
        
          req(input$mean, input$sel, input$name)
          var_name <- input$name
          new_var <- rv$data %>% transmute(!!var_name := rowMeans(select(., input$sel)))
          cat('Add ',var_name,'\n')
          rv$data <- cbind(rv$data, new_var)
          
          output$DF <- renderDataTable({
            cat('update \n')    
            rv$data
          })
        })
    
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 感谢您的回答。但它仍然对我显示相同的结果。
    • 我得到一个新列,其中包含 rowmean 计算:这是您期望的结果吗?
    • 感谢您的回答,但它对我显示的结果相同。我想要做的是在appdata 中重复创建列。例如,在appdata(左说appdata2)中创建a1 之后,我想在appdata2 中添加另一个新变量a2。当我运行您的代码时,它会不断在appdata 中创建新列。你能帮我处理一下吗?
    猜你喜欢
    • 2016-02-10
    • 2021-10-09
    • 2021-03-05
    • 2015-03-21
    • 1970-01-01
    • 2017-07-27
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多