R 闪亮循环逻辑运算符

R Shiny loop logical operator

我有一个 运行 示例:我正在根据用户通过复选框输入的内容更新 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 的新手。感谢您的帮助!谢谢

在循环方法中,我们可以初始化一个 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)

--输出