Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用反应性生成的闪亮对象作为另一个反应性事件的输入_R_Shiny_Dt - Fatal编程技术网

R 使用反应性生成的闪亮对象作为另一个反应性事件的输入

R 使用反应性生成的闪亮对象作为另一个反应性事件的输入,r,shiny,dt,R,Shiny,Dt,我的闪亮应用程序使用DT库呈现动态数据帧。用户可以通过单击来选择所需的行。选择行后,应用程序将以数据帧的形式显示并下载转置的行。但是,在这样做(显示和下载)时,我遇到了如下错误- 错误 警告:[.data.frame:选择了未定义的列[No stack trace available]时出错。 下面是详细的步骤 获取的数据(比如从某个网站获取的数据) 用户通过单击行来选择行,然后单击actionButton()将它们标记为“第一组” 用户清除之前的选择并重复与“步骤-2”相同的步骤来创建第二个组

我的闪亮应用程序使用
DT
库呈现动态数据帧。用户可以通过单击来选择所需的行。选择行后,应用程序将以数据帧的形式显示并下载转置的行。但是,在这样做(显示和下载)时,我遇到了如下错误-

错误
警告:[.data.frame:选择了未定义的列[No stack trace available]时出错。

下面是详细的步骤

  • 获取的数据(比如从某个网站获取的数据)
  • 用户通过单击行来选择行,然后单击
    actionButton()
    将它们标记为“第一组”
  • 用户清除之前的选择并重复与“步骤-2”相同的步骤来创建第二个组
  • clean()函数将转换数据框(行名将变为列名),然后根据用户选择的
    row.names()
    对数据框进行子集化
  • 添加注释的可复制代码

    库(闪亮)
    图书馆(DT)
    
    temp_func您的子集设置错误;
    g1
    g2
    是行名,但您在需要列名的
    子集中使用了它(因此您得到了错误消息)。因此,我更改了
    clean
    函数。由于没有堆栈跟踪,因此您的错误消息信息量不大。如果您想获取堆栈跟踪,应使用RStudio中的闪亮应用程序模板(请参见6.2.1末尾)。这样,我就可以

    Warnung: Error in [.data.frame: undefined columns selected
      78: stop
      77: [.data.frame
      75: subset.data.frame
      73: clean [C:\Users\jhage\Documents\Programmierung\Shiny_tests\app_2\shinytest7/app.R#12]
      72: observeEventHandler [C:\Users\jhage\Documents\Programmierung\Shiny_tests\app_2\shinytest7/app.R#63]
       1: runApp
    
    因此,调试更容易

    更正后的代码:

    library(shiny)
    library(DT)
    
    temp_func <- function(){
      x <- mtcars
      y = x[,1]
      return(list(complete_df = as.data.frame(x), column1 = as.data.frame(y)))
    }
    
    clean <- function(df, g1, g2){
      df_selection <- df[c(which(rownames(df) == g1), which(rownames(df) == g2)),  ]
      df_new <- t(df_selection)
      return(as.data.frame(df_new))
    }
    
    # UI
    ui <- shinyUI({
      fluidPage(
        actionButton("fetch", label = "Step1-Fetch data first"),
        DT::dataTableOutput("table"),br(),
        tags$h5("Selected for Group-1"), verbatimTextOutput("Group1"),br(),
        tags$h5("Selected for Group-2"),verbatimTextOutput("Group2"),hr(),br(),
        tags$h4("Follow Steps: "),
        actionButton("selG1", label = "Step-2: Mark as  Group-1"),
        actionButton("clear", label = "Step-3: Clear Selection"),
        actionButton("selG2", label = "Step-4: Mark as Group-2"),
        actionButton("cleanIt", "Step-5: Clean Dataframe"),
        DT::dataTableOutput("table2"),
        downloadButton("down", "Step-6: Download cleaned dataframe")
      )})
    
    # Server
    server <- Main_Server <- function(input,output,session){
      
      # Reactive Values
      values <- reactiveValues(table = NULL)
      group1 <- reactiveValues(Group1 = NULL)
      group2 <- reactiveValues(Group2 = NULL)
      clean_df <- reactiveValues(df = NULL)
      
      # fetchEvent (Consider temp_func() is fetching data from website)
      observeEvent(input$fetch, {values$table <- temp_func()})
      
      # Rendering table for display
      output$table <- renderDT({datatable(values$table$complete_df)})
      
      # Selection Event (Gorup1)
      observeEvent(input$selG1, {group1$Group1 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
      
      # Reset selections
      observeEvent(input$clear, {output$table <- renderDT({datatable(values$table$complete_df)})})
      
      # Selection Event (Gorup1)
      observeEvent(input$selG2, {group2$Group2 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
      
      # Print Events
      output$Group1 <- renderPrint({group1$Group1})
      output$Group2 <- renderPrint({group2$Group2})
      
      # observeEvent
      observeEvent(input$cleanIt, {clean_df$df <- clean(values$table$complete_df, group1$Group1, group2$Group2)
      })
      
      # Rendering table for display
      output$table2 <- renderDT({datatable(clean_df$df$df_new)})
      
      # Combined Download
      output$down <- downloadHandler(
        filename = function() { "File.csv"},
        content = function(file) {write.csv(clean_df$df$df_new, file)})
      
    }
    
    # Run-app
    shinyApp(ui, server)
    
    库(闪亮)
    图书馆(DT)
    临时函数
    
    library(shiny)
    library(DT)
    
    temp_func <- function(){
      x <- mtcars
      y = x[,1]
      return(list(complete_df = as.data.frame(x), column1 = as.data.frame(y)))
    }
    
    clean <- function(df, g1, g2){
      df_selection <- df[c(which(rownames(df) == g1), which(rownames(df) == g2)),  ]
      df_new <- t(df_selection)
      return(as.data.frame(df_new))
    }
    
    # UI
    ui <- shinyUI({
      fluidPage(
        actionButton("fetch", label = "Step1-Fetch data first"),
        DT::dataTableOutput("table"),br(),
        tags$h5("Selected for Group-1"), verbatimTextOutput("Group1"),br(),
        tags$h5("Selected for Group-2"),verbatimTextOutput("Group2"),hr(),br(),
        tags$h4("Follow Steps: "),
        actionButton("selG1", label = "Step-2: Mark as  Group-1"),
        actionButton("clear", label = "Step-3: Clear Selection"),
        actionButton("selG2", label = "Step-4: Mark as Group-2"),
        actionButton("cleanIt", "Step-5: Clean Dataframe"),
        DT::dataTableOutput("table2"),
        downloadButton("down", "Step-6: Download cleaned dataframe")
      )})
    
    # Server
    server <- Main_Server <- function(input,output,session){
      
      # Reactive Values
      values <- reactiveValues(table = NULL)
      group1 <- reactiveValues(Group1 = NULL)
      group2 <- reactiveValues(Group2 = NULL)
      clean_df <- reactiveValues(df = NULL)
      
      # fetchEvent (Consider temp_func() is fetching data from website)
      observeEvent(input$fetch, {values$table <- temp_func()})
      
      # Rendering table for display
      output$table <- renderDT({datatable(values$table$complete_df)})
      
      # Selection Event (Gorup1)
      observeEvent(input$selG1, {group1$Group1 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
      
      # Reset selections
      observeEvent(input$clear, {output$table <- renderDT({datatable(values$table$complete_df)})})
      
      # Selection Event (Gorup1)
      observeEvent(input$selG2, {group2$Group2 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
      
      # Print Events
      output$Group1 <- renderPrint({group1$Group1})
      output$Group2 <- renderPrint({group2$Group2})
      
      # observeEvent
      observeEvent(input$cleanIt, {clean_df$df <- clean(values$table$complete_df, group1$Group1, group2$Group2)
      })
      
      # Rendering table for display
      output$table2 <- renderDT({datatable(clean_df$df$df_new)})
      
      # Combined Download
      output$down <- downloadHandler(
        filename = function() { "File.csv"},
        content = function(file) {write.csv(clean_df$df$df_new, file)})
      
    }
    
    # Run-app
    shinyApp(ui, server)