为什么要在闪亮的应用程序中使用 tagQuery()?

Why use tagQuery() in shiny apps?

我读过这个 article on tagQuery 并且想知道在闪亮的应用程序中有什么实际用途。

是不是在服务端修改一个tag,类似shinyjs::addClass()

我认为当您需要修改或提取部分内容时,它最有用 潜在的深层嵌套 HTML 结构。特别是可能会出现这种需要 在您无法控制创建原始结构的情况下, 但要依靠一个包来为你做到这一点。

举个真实的例子, 可以从使用 tagQuery().

中获益

作为设置,我们有一个动态生成的菜单。在那里,我们要添加 一个 id 属性到里面的 ul 元素,以便以后能够 使用 JavaScript.

定位该元素
library(shinydashboard, warn.conflicts = FALSE)
library(htmltools)

tabs_list <- lapply(1:2, function(x) {
  menuSubItem(text = paste("tab", x))
})

menu <- menuItem("test_tabs", tabs_list)
print(menu)
#> <li class="treeview">
#>   <a href="#">
#>     <span>test_tabs</span>
#>     <i class="fa fa-angle-left pull-right" role="presentation" aria-label="angle-left icon"></i>
#>   </a>
#>   <ul class="treeview-menu" style="display: none;" data-expanded="test_tabs">
#>     <li>
#>       <a href="#">
#>         <i class="fa fa-angle-double-right" role="presentation" aria-label="angle-double-right icon"></i>
#>         tab 1
#>       </a>
#>     </li>
#>     <li>
#>       <a href="#">
#>         <i class="fa fa-angle-double-right" role="presentation" aria-label="angle-double-right icon"></i>
#>         tab 2
#>       </a>
#>     </li>
#>   </ul>
#> </li>

这是原来的方法:

menu_orig <- menu
menu_orig$children[[2]] <- tagAppendAttributes(menu_orig$children[[2]], id = "test_tabs")

有了 tagQuery() 这会更容易理解也更健壮:

menu_tq <- tagQuery(menu)$find("ul")$addAttrs(id = "test_tabs")$allTags()

# Check that we got the same result
identical(format(menu_orig), format(menu_tq))
#> [1] TRUE

我想补充一下@MikkoMarttila 回答的几个方面(评论太长):

tagQuery 为您提供了在 R 中操作 HTML 标签的可能性(不需要 JS)。

请参阅 Outstanding User Interfaces with Shiny 中的 this section 以获取大量优秀示例。

我最近给出了一个相关的答案 ,它展示了如何制作一个闪亮的应用程序 w3c 兼容 - 因此 tagQuery 可以帮助您准备好应用程序生产(关于 UI).

另请注意,tagQuery 可以在 renderUI 调用中/与调用一起动态使用 - 请参阅 示例。