【问题标题】:Using an multiple input from Shiny in Reshape2 dcast()在 Reshape2 dcast() 中使用来自 Shiny 的多个输入
【发布时间】:2018-11-03 14:23:29
【问题描述】:

参考Using an input from Shiny Widget in Reshape Cast(), 我可以通过单行变量的 Shiny 输入创建动态汇总表。

但是,当我希望创建多个行层列时,我发现找不到第二个或第三个对象。 我试图打印出公式,这似乎是正确的。比如Shiny中选择了“vs”和“hp”,那么公式就变成了“vs + hp~gear”,看起来是对的。但是会出现“object 'hp' not found”的错误。

您能帮我解决这个问题吗? 谢谢!

用户界面:

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

ui <- fluidPage(
  headerPanel("Summary Table"),
  sidebarPanel(selectInput("row", "Row variable", names(mtcars), selected = "vs", multiple = T),
               selectInput("col", "Column variable", names(mtcars), selected = "gear")),
  mainPanel(DT::dataTableOutput('table'))
)

服务器:

server <- function(input, output) {

  output$table <- renderDataTable({

    formula <- as.formula(paste(paste(input$row, collapse = "+"), "~", input$col))
    print(formula)

    car0 <- mtcars %>% 
      group_by_(input$row, input$col) %>% 
      summarize(n = n_distinct(cyl)) %>% 
      dcast(formula, value.var = "n")   

    datatable(car0)

  })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny reshape2 dcast


    【解决方案1】:


    像这样?

    library(shiny)
    library(dplyr)
    library(reshape2)
    library(tidyr)
    library(DT)
    ui <- fluidPage(
      headerPanel("Summary Table"),
      sidebarPanel(selectInput("row", "Row variable", names(mtcars), selected = "vs", multiple = T),
                   selectInput("col", "Column variable", names(mtcars), selected = "gear")),
      mainPanel(DT::dataTableOutput('table'))
    )
    
    server <- function(input, output) {
    
      output$table <- renderDataTable({
    
        car0 <- mtcars %>% 
          select(input$row,input$col,cyl)%>%
          group_by_at(., vars(input$row, input$col))%>%
          summarize(n = n_distinct(cyl))%>%
          tidyr::spread(input$col,n)
    
    
        datatable(car0)
    
      })
    }
    
    shinyApp(ui, server)
    

    对于公式和reshape2

    library(shiny)
    library(dplyr)
    library(reshape2)
    library(tidyr)
    library(DT)
    ui <- fluidPage(
      headerPanel("Summary Table"),
      sidebarPanel(selectInput("row", "Row variable", names(mtcars), selected = "vs", multiple = T),
                   selectInput("col", "Column variable", names(mtcars), selected = "gear")),
      mainPanel(DT::dataTableOutput('table'))
    )
    
    server <- function(input, output) {
    
      output$table <- renderDataTable({
    
        formula <- as.formula(paste(paste(input$row, collapse = "+"), "~", input$col))
        print(formula)
    
        car0 <- mtcars %>% 
          select(input$row,input$col,cyl)%>%
          group_by_at(., vars(input$row, input$col))%>%
          summarize(n = n_distinct(cyl))%>%
          #tidyr::spread(input$col,n)
          dcast(formula, value.var = "n")  
    
    
        datatable(car0)
    
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 谢谢,这确实解决了我的问题。但仍然想知道如何使用公式函数来实现这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 2012-07-22
    • 2014-10-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多