【问题标题】:R Shiny loop logical operatorR闪亮循环逻辑运算符
【发布时间】:2018-06-11 07:24:54
【问题描述】:

我有一个正在运行的示例:我正在根据用户通过复选框输入的内容更新 data.table。到目前为止,我正在显式过滤数据,但我想在循环的帮助下使用 for 循环或 apply-family 的函数来做到这一点。不幸的是,我不能让任何一个工作。

library(shiny)
library(data.table)
library(DT)

tdata <- data.table(fruit = c(rep("Apple",4),rep( "Ban",4)), 
                    bug1 = c(rep(c("+","+", "-","-"),2)),
                    bug2 = c(rep(c("+","-"),4)),
                    value = c(rep(c(0.25),4), 0.6,0.4,0,0))

ui <- (fluidPage(tagList(
             sidebarLayout(
               sidebarPanel(uiOutput("file_input")),
               mainPanel(dataTableOutput('fruit_table')) 
      ))))

server <- function(input, output) {

  fileData <- reactive(
      return(tdata)
  )

  colname_list <- reactive( 
    colnames(fileData())
  )


  output$file_input <- renderUI ({
    if(is.null(fileData())){
      return()
    }else{
      tagList(
        lapply(1:(length(fileData())-1), function(i){
        choice_list = unique(fileData()[,get(colnames(fileData()[,i, with = FALSE]))])
        checkboxGroupInput(inputId = colnames(fileData()[,i, with = FALSE]),
                           label = colnames(fileData()[,i, with = FALSE]),
                           choices = choice_list,
                           inline = TRUE,
                           selected = fileData()[1, i, with = FALSE])
        })
      )
    }
  })

 # works fine, but usually the number of columns changes so I want to keep it flexible       


  fruitFilter <- reactive({
    fileData()[[paste0(colname_list()[1])]] %in% input[[paste0(colname_list()[1])]] &
      fileData()[[paste0(colname_list()[2])]] %in% input[[paste0(colname_list()[2])]] &
      fileData()[[paste0(colname_list()[3])]] %in% input[[paste0(colname_list()[3])]]
  })

  # fruitFilter <- reactive({
  #     for(i in 1: ((length(fileData()))-1)){
  #       fileData()[[paste0(colname_list()[i])]] %in% input[[paste0(colname_list()[i])]]
  #     }
  #  })

  output$fruit_table <- renderDataTable({
    datatable(fileData()[fruitFilter(),])
  })

}

shinyApp(ui = ui, server = server)

我仍然认为自己是 Shiny 的新手。我很感激任何帮助!谢谢。

【问题讨论】:

    标签: r loops shiny logical-operators


    【解决方案1】:

    在循环方法中,我们可以初始化list,然后将Reduce 的输出初始化为单个logical 向量

    fruitFilter <- reactive({
    
           i1 <- head(seq_along(fileData()), -1)
           l1 <- vector('list', length(i1))
           for(i in i1){
    
             l1[[i]] <- fileData()[[colname_list()[i]]] %in% input[[colname_list()[i]]]
    
           }
    
           Reduce(`&`, l1)
        })
    

    完整代码

    library(shiny)
    library(data.table)
    library(DT)
    
    tdata <- data.table(fruit = c(rep("Apple",4),rep( "Ban",4)), 
                        bug1 = c(rep(c("+","+", "-","-"),2)),
                        bug2 = c(rep(c("+","-"),4)),
                        value = c(rep(c(0.25),4), 0.6,0.4,0,0))
    
    ui <- (fluidPage(tagList(
      sidebarLayout(
        sidebarPanel(uiOutput("file_input")),
        mainPanel(dataTableOutput('fruit_table')) 
      ))))
    
    server <- function(input, output) {
    
      fileData <- reactive(
        return(tdata)
      )
    
      colname_list <- reactive( 
        colnames(fileData())
      )
    
    
      output$file_input <- renderUI ({
        if(is.null(fileData())){
          return()
        }else{
          tagList(
            lapply(1:(length(fileData())-1), function(i){
              choice_list = unique(fileData()[,get(colnames(fileData()[,i, with = FALSE]))])
              checkboxGroupInput(inputId = colnames(fileData()[,i, with = FALSE]),
                                 label = colnames(fileData()[,i, with = FALSE]),
                                 choices = choice_list,
                                 inline = TRUE,
                                 selected = fileData()[1, i, with = FALSE])
            })
          )
        }
      })
    
    
    
       fruitFilter <- reactive({
    
           i1 <- head(seq_along(fileData()), -1)
           l1 <- vector('list', length(i1))
           for(i in i1){
    
             l1[[i]] <- fileData()[[colname_list()[i]]] %in% input[[colname_list()[i]]]
    
           }
    
           Reduce(`&`, l1)
        })
    
      output$fruit_table <- renderDataTable({
        datatable(fileData()[fruitFilter()])
      })
    
    }
    
    shinyApp(ui = ui, server = server)
    

    --输出

    【讨论】:

    • 感谢您向我介绍 Reduce 功能。很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多