Shiny - 使用 insertUI 的动态数据过滤器

2024-02-07

我是闪亮的新手,正在尝试编写一个应用程序,用户可以在其中动态添加数据过滤器(请参阅下面的代码)。 我认为 insertUI 和 remove UI 对于这个目的来说非常酷。 但是,我有几个问题:

    1) I cannot address dynamically generates input$ids (see filterId in the code, l. 36 and l. 58)
    2) in updateCheckboxGroupInput (l. 62) checkboxes are not preselected.
    3) I cannot select data rows using which() (l. 74)
    4) The checkboxes are not displayed inside the column, but spread over the whole page.

我非常感谢任何提示。

谢谢,乔迪

这里是代码:

library(shiny)

rowvalues <- function(col,data) {
  as.list(unique(data[col]))
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fluidRow(
        column(6, actionButton('addFilter', 'Add filter')),
        column(6, actionButton('removeFilter', 'Remove filter')),
        offset = 6
      ),
      tags$hr(),
      tags$div(id = 'placeholderAddRemFilt'),
      tags$div(id = 'placeholderFilter'),
      width = 4 # sidebar
    ),
    mainPanel(
      tableOutput("data")
    )
  )
)

server <- function(input, output,session) {
  filter <- character(0)

  observeEvent(input$addFilter, {
    add <- input$addFilter
    filterId <- paste0('Filter', add)
    headers <- names(mtcars)
    insertUI(
      selector = '#placeholderFilter',
      ui = tags$div(
        # selectInput(filterId, label = paste0("Filter ",add), # does not work
        selectInput("ColFilter", label = paste0("Filter ",add), 
                    choices = as.list(headers), 
                    selected = 1),
        checkboxGroupInput("RowFilter", label = "Select variable values",
                           choices = NULL, selected = NULL, 
                           inline = TRUE, width = 4000),
        id = filterId
      )
    )

    filter <<- c(filter,filterId)
  })

  observeEvent(input$removeFilter, {
    removeUI(
      ## pass in appropriate div id
      selector = paste0('#', filter[length(filter)])
    )
    filter <<- filter[-length(filter)]
  })

  # observeEvent(input$filterId, { # does ntót work
  observeEvent(input$ColFilter, {
    col <- input$ColFilter
    values <- as.list(unique(mtcars[col]))[[1]]
    updateCheckboxGroupInput(session,"RowFilter", label = "Select variable    values", 
                              choices = values, selected = values, 
                              inline = TRUE)
  })

  output$data <- renderTable({
    col <- input$ColFilter
    rows <- input$RowFilter
    print(c("selected col: ",col))
    print(c("selected rows: ",as.vector(rows)))
    if(is.null(col)) mtcars
    else {
      mtcars[which(mtcars$col != rows),]
    }
  })
 }

shinyApp(ui = ui, server = server)

请参阅下面的代码以获取我的建议。我基本上做了您希望/尝试做的事情,即动态添加观察者,以便每个新的过滤器元素都有自己的观察者。事实证明:你可以做到。就这样。因此,我在渲染 ui 元素的确切observeEvent 中添加了观察者,为它们提供所需的反应性。我什至添加了“个人”删除按钮,这比仅删除最底部的按钮更方便。此外,处理所有这些过滤器的逻辑将是一个聚合列表,用于存储当前在各个过滤器中选择的所有信息。这使得 renderTable 部分变得更加容易。

请熟悉代码,如果有任何不确定之处请询问。

此致

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fluidRow(
        column(6, actionButton('addFilter', 'Add filter')),
        offset = 6
      ),
      tags$hr(),
      tags$div(id = 'placeholderAddRemFilt'),
      tags$div(id = 'placeholderFilter'),
      width = 4 # sidebar
    ),
    mainPanel(
      tableOutput("data")
    )
  )
)

server <- function(input, output,session) {
  filter <- character(0)

  makeReactiveBinding("aggregFilterObserver")
  aggregFilterObserver <- list()

  observeEvent(input$addFilter, {
    add <- input$addFilter
    filterId <- paste0('Filter_', add)
    colfilterId <- paste0('Col_Filter_', add)
    rowfilterId <- paste0('Row_Filter_', add)
    removeFilterId <- paste0('Remove_Filter_', add)
    headers <- names(mtcars)
    insertUI(
      selector = '#placeholderFilter',
      ui = tags$div(id = filterId,
        actionButton(removeFilterId, label = "Remove filter", style = "float: right;"),
        selectInput(colfilterId, label = "Some Filter", choices = as.list(headers), selected = 1),
        checkboxGroupInput(rowfilterId, label = "Select variable values",
                           choices = NULL, selected = NULL, width = 4000)
      )
    )

    observeEvent(input[[colfilterId]], {

      col <- input[[colfilterId]]
      values <- as.list(unique(mtcars[col]))[[1]]

      updateCheckboxGroupInput(session, rowfilterId , label = "Select variable    values", 
                              choices = values, selected = values, inline = TRUE)

      aggregFilterObserver[[filterId]]$col <<- col
      aggregFilterObserver[[filterId]]$rows <<- NULL
    })

    observeEvent(input[[rowfilterId]], {

      rows <- input[[rowfilterId]]

      aggregFilterObserver[[filterId]]$rows <<- rows

    })

    observeEvent(input[[removeFilterId]], {
      removeUI(selector = paste0('#', filterId))

      aggregFilterObserver[[filterId]] <<- NULL

    })
  })

  output$data <- renderTable({

    dataSet <- mtcars

    invisible(lapply(aggregFilterObserver, function(filter){

      dataSet <<- dataSet[which(!(dataSet[[filter$col]] %in% filter$rows)), ]

    }))

    dataSet
  })
 }

shinyApp(ui = ui, server = server)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiny - 使用 insertUI 的动态数据过滤器 的相关文章

随机推荐

  • 检测程序何时打开 fifo

    我遇到一种情况 我需要检查 fifo 的另一侧是否已打开它 但是我不能使用 open 因为否则程序将开始执行操作 为什么我必须这样做 我有一个程序 监视器 来启动服务器程序 都是我创建的 监视器使用此 fifo 进行通信 因为监视器可以在服
  • 分配大的 DMA 缓冲区

    我想分配一个大的 DMA 缓冲区 大小约为 40 MB 当我使用dma alloc coherent 它失败了 我看到的是 cut here WARNING at mm page alloc c 2106 alloc pages nodem
  • CORS - Angular 和 Express 的 http OPTIONS 错误

    我正在尝试从 Angularjs 客户端向我的 API 发送 POST 我在另一个域中运行的服务器上有此配置 app use function req res next res setHeader Access Control Allow
  • 如何使用 POI 删除合并区域?

    我知道我们可以使用sheet addMergedRegion range 合并单元格 我想知道如何删除合并 我们可以使用sheet removeMergedRegion int 如果是 那么告诉我应该争论什么 合并单元格中存在的数据将会发生
  • 在 akka.net 中立即触发多个线程

    我不确定这是否与 akka net 或 TPL 更多相关 但我将使用 actor 作为示例来澄清问题 简而言之 问题是 有什么方法可以告诉 akka net 一次触发比我实际拥有的 CPU 核心更多的线程吗 这是示例代码和详细信息 我目前使
  • D3 和​​ jQuery 有什么区别?

    参考这个例子 http vallandingham me stepper steps html http vallandingham me stepper steps html 看起来 D3 和 jQuery 库非常相似 因为它们都以对象链
  • 如何将 Visual Studio 默认为 C# 项目而不是 VB.NET?

    Visual Studio 2010 一直默认为 VB NET 项目而不是 C 我从 2008 年导入了保存的设置 该设置默认为 C 项目 但没有解决问题 我总是不小心创建了 VB NET 项目 然后打自己的脸 然后继续删除该项目并重新创建
  • 从 C 中的另一个函数调用 main 函数

    我有一个主函数 它在初始化期间运行一些函数 然后运行一个等待来自 UART 的命令的 while 循环 当我看到特定命令 比如说重置 时 我会调用一个返回值的函数 我想做以下事情 保存返回值 使用返回值再次启动主函数 main 中的函数初始
  • 将空列表列添加到 DataFrame

    类似这个问题如何向数据框中添加空列 https stackoverflow com questions 16327055 how to add an empty column to a dataframe 我有兴趣了解向 DataFrame
  • 将二维数组转换为两列数据框 pandas

    如果我有以下内容 如何使 pd DataFrame 将此数组转换为具有两列的数据框 最有效的方法是什么 我当前的方法包括将每个副本创建为一系列副本 并从中创建数据帧 由此 u 294 24 L u 294 26 R u 981 71 L u
  • 更改默认浅灰色背景颜色

    默认情况下 我在react native项目中创建的每个屏幕都使用非常浅的灰色作为其背景颜色 正如你在这里看到的 我想知道而不是我设置backgroundColor对于我项目的每个屏幕 反应本机项目中是否有一个全局位置 我可以设置backg
  • 将 META-INF\services\javax.xml.parsers.SAXParserFactory 添加到 jar

    我有一个文件夹 里面有几个类文件 我用来创建 jar 的命令是 jar cfm0 my jar MANIFEST class 现在我还想将以下内容添加到 jar META INF services javax xml parsers SAX
  • 为什么浏览器导航栏中 http:// 包含两个斜杠而 file:/// 包含三个斜杠?

    为什么http 包含两个斜杠 这只是 URL 的标准 还是有任何逻辑意义 为什么会这样file 包含三个斜杠 如file C a html The 权威成分 https www rfc editor org rfc rfc3986 sect
  • 我在哪里可以找到 Windows 7 上的 ideavim 0.41 的 .ideavimrc 文件?

    I use android studio on Windows 7 and it installed IdeaVim i used map jj
  • 为什么我们需要使用package.json? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 JavaScript 来学习网络套接字site http socket io get started chat 但我不明白为什么我需要使用包 json 这是我的 package json 文件代码
  • ArangoDB 分面搜索性能

    我们正在评估 ArangoDB 在构面计算空间中的性能 还有许多其他产品能够通过特殊的 API 或查询语言执行相同的操作 马克逻辑方面 ElasticSearch 聚合 Solr 分面等 我们知道 Arango 中没有特殊的 API 来显式
  • 我如何模拟聚合物核心ajax,以进行单元测试

    我正在为我的新聚合物项目建造脚手架 并正在考虑进行单元测试 我想我会使用业力 茉莉花组合 有一个有趣的帖子在http japhr blogspot co uk 2014 03 polymer page objects and jasmine
  • 如何获取包含日期、小时和分钟的 ISO 8601 格式的当前时刻?

    最优雅的获取方式是什么ISO 8601 http en wikipedia org wiki ISO 8601当前时刻的格式化表示 UTC 它应该看起来像 2010 10 12T08 50Z Example String d DateFor
  • 打开第二个数据库连接时外键锁定事务超时

    我遇到一个问题 涉及一个类中的数据库事务 该事务由于在事务中打开辅助数据库连接而超时 当我添加外键约束时 问题开始出现 并且 测试使用 SET foreign key checks 0 我已经能够证实这一点 我的数据库类如下所示 我放弃了所
  • Shiny - 使用 insertUI 的动态数据过滤器

    我是闪亮的新手 正在尝试编写一个应用程序 用户可以在其中动态添加数据过滤器 请参阅下面的代码 我认为 insertUI 和 remove UI 对于这个目的来说非常酷 但是 我有几个问题 1 I cannot address dynamic