【问题标题】:Select row(s) from a summary data table and use cell value to subset original data and create a new data table in Shiny从汇总数据表中选择行并使用单元格值对原始数据进行子集化并在 Shiny 中创建新数据表
【发布时间】:2018-04-29 13:57:39
【问题描述】:

我从 iris 数据集创建了一个汇总表,当我从该 datatable 中选择任何行时,我想使用所选行来对主要数据进行子集化,然后将该子集数据发布为 datatable

    library(shiny)
    library(dplyr)
    library(DT)


    setwd("C:/Users/143812/Documents/Shiny")

    df <- iris
    vchoices <- colnames(df)
    ui <- fluidPage(h1("PLOT FOR NOW"),
                    sidebarLayout(sidebarPanel(
                      fluidPage(
                        column(10,selectInput(inputId = "group",label = "Group BY",choices = vchoices)),
                        column(10,selectInput(inputId = "operator",label = "OPERATOR",choices = c("sum","mean"),selected = "sum")),
                        column(10,uiOutput("operateUI"))
                      )

                    ),
                    mainPanel(dataTableOutput("summarytable"),dataTableOutput("drilldata")))
    )

    server <- function(input,output,session){
      df1 <- reactive({df %>% group_by_(input$group) %>% summarise(Result = get(input$operator)(get(input$operate)))})

      #input for integer and numeric columns
      a <- (sapply(df,class))
      lv <- a=="integer" | a=="numeric" 
      b <- a[lv]
      numchoice <- names(b)
      output$operateUI <- renderUI({
        selectInput(inputId = "operate",label = input$operator,choices = numchoice)
      })

      #publish summary table to select output from by name summary table          
      output$summarytable <- DT::renderDataTable(df1())

      #create data for drill report          
      drilldata <- reactive({
                            shiny::validate(need(length(input$summarytable_rows_selected) > 0, "Select Rows to drill down")
                                            )
                            selected_column <-  df1[as.integer(input$summarytable_rows_selected),]$get(input$group)

                            df[df$get(input$group) %in% selected_column, ]

      })
      output$drilldata <- DT::renderDataTable(drilldata())


      #function end  
    }

    shinyApp(ui,server)

此代码给我错误:“闭包”类型的对象不是子集。 我要求用户选择分组依据和要执行的操作的列,总和或平均值以及要执行操作的列。此方法似乎在此代码中由 mlegge 工作,其中值是预定义的,而不是用户询问的。 link to question

【问题讨论】:

  • 尝试用df[[input$group]] 替换df$get(input$group) 另外,在summarise 中,我没有关注这个get(input$operator)(get(input$operate)) 你在应用一个函数吗
  • 使用df[[input$group]] 仍然会给出该错误,因为summarise get(input$operator) 给了我总和/平均值,(get(input$operate)) 给我列来执行操作。这变成了例如。 sum(Sepal.length)
  • 第二部分即子集不清楚。 input$summarytable_rows_selected 在哪里?第一步,你是summariseing by group。在该数据集中没有行索引。您究竟想如何为drilldata() 设置子集?假设您按“物种”分组,那么将有 3 行,并且不清楚 drilldata 代码的最后 2 行中的逻辑
  • input$ID_rows_selected 是 DT 包的一个函数,它返回选定的行。在这种情况下,来自renderdatatable(df1()) 的行,例如,如果我group by 物种将有三行,如果我单击其中datatable 的第一行,drilldata 的代码行第二,即df1[as.integer(input$summarytable_rows_selected),]$get(input$group) 将给我@987654343 @ as output as.integer(input$summarytable_rows_selected) == 1 get(input$group) == species df1[1,]$species == "setosa" 然后第三行 Drilldata 将从 df 中选择包含 setosa 作为物种的行

标签: r shiny dt


【解决方案1】:

您的错误信息很可能来自这一行

selected_column <-  df1[as.integer(input$summarytable_rows_selected),]$get(input$group)

您忘记了 df1 之后的函数括号 ()。对我来说 get() 不起作用,所以我改用 [[

试试

selected_column <-  df1()[as.integer(input$summarytable_rows_selected),][[input$group]]

这条线我也有问题

df[df$get(input$group) %in% selected_column, ]

改成

df[df[[input$group]] %in% selected_column, ]

它对我有用

【讨论】:

  • 非常感谢!这行得通。 get() 不为 selected_columns 工作有什么原因吗?在summarise 中使用时有效
  • 抱歉,我无法回答这个问题,因为我通常不使用get()
  • 我使用的是get(),因为 input$ID 的值是字符,我想将它们用作函数的参数,[[ ]] 是否也在做同样的事情?或者这是因为 input$ID 是一个列表输出而使用 [[ ]] 用于提取列表的元素。
  • 否,[[ 正在从 input$ID 的字符串值中提取,但您可以使用数字值以及第一个元素 [[1]]
猜你喜欢
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2019-06-24
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多