【问题标题】:Inserting columns in data frame Shiny R在数据框 Shiny R 中插入列
【发布时间】:2020-09-09 10:22:02
【问题描述】:

我有一个数据框,我需要能够在使用 Shiny 时插入列。函数 filedata 读取一个数据集,称为 filedata()。

  filedata <- reactive({
    req(input$file_selector)
    read.csv(paste0(parseDirPath(c(home = 'C:\\Users\\Ruben'), file_dir()),'\\',input$file_selector),skip=1)
  })

  output$filetable <- renderDataTable({
    filedata()
  })
  

当用户选中一个询问他/她是否要插入新列的框时,此代码会运行。但是,我收到“分配的无效(NULL)左侧”错误。我已经尝试了很多方法,但我无法弄清楚哪些地方做得不对。这段代码有什么问题?

input$qc_final_cols 是复选框 ID。

  df <- reactive({
    if (input$qc_final_cols){
      var_names = c('TA','PP','US','UD','UE','UG','UH','XR','RW','PA','TB4','TV2','TV4',
                    'TV8','TV20','TV40','MV2','MV4','MV8','MV20','MV40','VB','TA40','TA120','SD')
      output$column_names <- renderText(var_names)

      for (v in 1:length(var_names)){
        ind <- which(colnames(filedata()) == var_names[v])
        filedata() <- filedata() %>% add_column(z = NA,.after = ind)
        colnames(filedata())[ind+1] <- paste0(var_names[v],'_QC')

        filedata() <- filedata() %>% add_column(y = NA,.after = ind+1)
        colnames(filedata())[ind+2] <- paste0(var_names[v],'_Final')
      }
    }
  })

      output$filetable <- renderDataTable({
df()})  

【问题讨论】:

  • 你不能像filedata() &lt;- filedata()…这样进行分配,请查看反应式编程。

标签: r shiny


【解决方案1】:

问题可能与filedata() &lt;- filedata()... 有关,其中filedata() 是一个反应式表达式。该分配可能会导致错误。

考虑创建一个包含您的数据的reactiveValues 对象 (rv),您可以在其中添加列、更改列名等。注意observe 的使用将用于读取文件并分配数据框(df)到rv

也许在检查框时,将调用 observeEvent表达式,可以在此处添加您的列。请注意,您无需将 output$column_names 放入其中,因为它会自动更新。

如果这不起作用或没有帮助,请告诉我。但是,如果您能够在闪亮中提供一个完整但最小的可重现示例,它可能会更有帮助。

server <- function(input,output){
  
  var_names = c('TA','PP','US','UD','UE','UG','UH','XR','RW','PA','TB4','TV2','TV4',
                'TV8','TV20','TV40','MV2','MV4','MV8','MV20','MV40','VB','TA40','TA120','SD')
  
  rv <- reactiveValues(df = NULL)
  
  #This function is responsible for loading in the selected file
  observe({
    req(input$file_selector)
    rv$df <- read.csv("test9820.csv") # Simplified for testing
  })
  
  # This previews the CSV data file
  output$filetable <- renderDataTable({
    rv$df
  })
  
  observeEvent(input$qc_final_cols, {
    
    if (input$qc_final_cols){
      for (v in 1:length(var_names)){
        ind <- which(colnames(rv$df) == var_names[v])
        rv$df <- rv$df %>% 
          add_column(z = NA,.after = ind)
        colnames(rv$df)[ind+1] <- paste0(var_names[v],'_QC')
        rv$df <- rv$df %>% 
          add_column(y = NA,.after = ind+1)
        colnames(rv$df)[ind+2] <- paste0(var_names[v],'_Final')
      }
    }
  })
  
}

【讨论】:

  • 我不得不说你的回答很棒,尤其是它演示了如何进行一些反应式编程。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多