【发布时间】: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]]仍然会给出该错误,因为summariseget(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 outputas.integer(input$summarytable_rows_selected)== 1get(input$group)== speciesdf1[1,]$species== "setosa" 然后第三行 Drilldata 将从df中选择包含 setosa 作为物种的行