首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shinyTree不呈现复选框输出

shinyTree不呈现复选框输出
EN

Stack Overflow用户
提问于 2016-09-11 08:13:02
回答 1查看 523关注 0票数 1

我使用shinyTree来呈现数据表。以下是迄今为止使用的代码的数据集:

代码语言:javascript
复制
library(shiny)
library(shinyTree)

newdat <- structure(list(RESPID = c("41000123", "41004132", "41006132", 
"41007121", "41007123"), PDT_A = c(125, 66, 45, 28, 
0), PDT_B = c(10, 0, 0, 0, 0), PDT_C = c(0, 0, 0, 0, 0), PDT_D = c(450, 
105, 75, 192, 0), PDT_TOTAL = c(585, 171, 120, 220, 0)), .Names = c("RESPID", 
"PDT_A", "PDT_B", "PDT_C", "PDT_D", "PDT_TOTAL"), row.names = c("6", 
"40", "56", "59", "61"), class = "data.frame")


server <- shinyServer(function(input, output, session) {

    newdata <- reactive({newdat})

  output$tree <- renderTree({
    sss=list('TOTAL_VALUE'= list('TOTAL_VALUE_OF_MERCHANDISE'   =  structure(list('PDT_TOTAL'='1001'), stopened=FALSE),
        'PDT_CAT'   =  structure(list('PDT_TOTAL'='1002','PDT_A'='152','PDT_B'='153','PDT_C'='154','PDT_D'='155'), stopened=FALSE)
        ))
    attr(sss[[1]],"stopened")=FALSE 
    sss
  })

  catdat <- reactive({
      tree <- input$tree
      unlist(get_selected(tree))
  })

  coldat <- reactive({
      newdata()[,catdat()]
  })

  output$datatab <- renderDataTable({
        coldat()
  })


})


ui <- shinyUI(
  pageWithSidebar(
    headerPanel("TEST"),
    sidebarPanel(
      shinyTree("tree", checkbox = TRUE)
    ),
    mainPanel(
      dataTableOutput("datatab")
    )
  ))

shinyApp(ui,server)

树就产生了。在通过数据表输出呈现列时,我遇到了以下问题:

  1. 树的第一根树枝,只指一列:它没有在光亮中呈现。我收到一条错误消息undefined columns selected
  2. 树的第二个分支应该呈现表的所有五列。但是,它只呈现任意四个列。

如果我选择第二个分支的根,我将得到相同的undefined columns selected。当我取消选中其中一个分支时,会呈现带有4列的表。

如何呈现所有列?有办法在分支根/节点级别删除复选框吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-11 10:31:40

Ad 1.会出现此错误,因为如果选择树的第一个分支,则catdat()将返回带有"PDT_TOTAL""TOTAL_VALUE_OF_MERCHANDISE"的向量,并且数据集中没有"TOTAL_VALUE_OF_MERCHANDISE"这样的变量。

Ad 2.如果您选择了所有五个选项,那么catdat()将返回额外的"PDT_CAT",并且您有相同的问题--在您的数据集中没有这样的变量。(上面相同--如果您选择了所有选项,那么"PDT_TOTAL",它将返回额外的"TOTAL_VALUE_OF_MERCHANDISE")

若要呈现所有列,请执行以下操作:

首先,从数据集中动态选择变量,然后删除重复项,因为当选择第一个选项catdat()时,"TOTAL_VALUE"会返回两次TOTAL_VALUE

还有另一个问题:如果只选择一个变量,而newdata()[,vars]只对数据文件进行操作,renderDataTable不会打印任何内容,那么它将返回一个向量。要解决此问题,可以删除,以确保子设置始终返回一个dataframe - newdata()[vars]

代码语言:javascript
复制
coldat <- reactive({
    vars <- catdat()
    vars <- vars[!(vars %in% c("TOTAL_VALUE", "TOTAL_VALUE_OF_MERCHANDISE", "PDT_CAT"))]
    vars <- unique(vars)
    print(vars)

    # newdata()[,vars] # If you select only one variable then this reactive returns an object of class numeric and not a data.frame
    newdata()[vars] # remove "," and it will always return a data frame
  })

完整示例:

代码语言:javascript
复制
library(shiny)
library(shinyTree)

newdat <- structure(list(RESPID = c("41000123", "41004132", "41006132", 
                                    "41007121", "41007123"), PDT_A = c(125, 66, 45, 28, 
                                                                       0), PDT_B = c(10, 0, 0, 0, 0), PDT_C = c(0, 0, 0, 0, 0), PDT_D = c(450, 
                                                                                                                                          105, 75, 192, 0), PDT_TOTAL = c(585, 171, 120, 220, 0)), .Names = c("RESPID", 
                                                                                                                                                                                                              "PDT_A", "PDT_B", "PDT_C", "PDT_D", "PDT_TOTAL"), row.names = c("6", 
                                                                                                                                                                                                                                                                              "40", "56", "59", "61"), class = "data.frame")


server <- shinyServer(function(input, output, session) {

  newdata <- reactive({newdat})

  output$tree <- renderTree({
    sss=list('TOTAL_VALUE'= list('TOTAL_VALUE_OF_MERCHANDISE'   =  structure(list('PDT_TOTAL'='1001'), stopened=FALSE),
                                 'PDT_CAT'   =  structure(list('PDT_TOTAL'='1002','PDT_A'='152','PDT_B'='153','PDT_C'='154','PDT_D'='155'), stopened=FALSE)
    ))
    attr(sss[[1]],"stopened")=FALSE 
    sss
  })

  catdat <- reactive({
    tree <- input$tree
    unlist(get_selected(tree))
  })

  coldat <- reactive({
    vars <- catdat()
    vars <- vars[!(vars %in% c("TOTAL_VALUE", "TOTAL_VALUE_OF_MERCHANDISE", "PDT_CAT"))]
    vars <- unique(vars)
    print(vars)

    # newdata()[,vars] # If you select only one variable then this reactive returns an object of class numeric and not a data.frame
    newdata()[vars] # remove "," and it will always return a data frame
  })

  output$datatab <- renderDataTable({
    coldat()
  })


})


ui <- shinyUI(
  pageWithSidebar(
    headerPanel("TEST"),
    sidebarPanel(
      shinyTree("tree", checkbox = TRUE)
    ),
    mainPanel(
      dataTableOutput("datatab")
    )
  ))

shinyApp(ui,server)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39434117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档