我可以动态设置html类吗?或者 Shiny 是如何设置 'html'.hasClass('Shiny-busy') 的?

Posted

技术标签:

【中文标题】我可以动态设置html类吗?或者 Shiny 是如何设置 \'html\'.hasClass(\'Shiny-busy\') 的?【英文标题】:Can I set html class dynamically? Or how does Shiny set 'html'.hasClass('Shiny-busy')?我可以动态设置html类吗?或者 Shiny 是如何设置 'html'.hasClass('Shiny-busy') 的? 【发布时间】:2015-10-18 06:17:49 【问题描述】:

所以这更像是一个概念性问题,以响应在我闪亮的应用程序上使用“忙碌”通知:

conditionalPanel(
        condition="$('html').hasClass('shiny-busy')",
        img(src="images/busy.gif"))  

在对数据库的初始查询期间,我得到了一个动画 gif,但之后就变得不可预测了。如果进行了新的数据库调用,我在第二个条件面板中添加了隐藏输出图:

conditionalPanel(
     condition="!($('html').hasClass('shiny-busy'))",
     plotOutput("Some Graph"))  

设置通过第二次数据拉取工作,但如果进行第三次数据库查询,“Some Graph”不再隐藏,“busy.gif”不再显示。它会在加载新绘图时闪烁。

所以我的首要问题是: 有没有办法在服务器中显式设置 html 类? 或 Shiny 如何/何时设置类值?

【问题讨论】:

【参考方案1】:

我不打算对问题的其余部分发表评论,但我会回答“有没有办法在服务器中显式设置 html 类?”的问题

您可以使用包shinyjs 在服务器中添加/删除/切换HTML 元素的类。这是添加/删除“shiny-busy”类到/形成<html>标签的示例

library(shiny)
library(shinyjs)

runApp(shinyApp(
  ui = fluidPage(
    useShinyjs(),
    actionButton("add", "add `shiny-busy` class to html tag"),
    actionButton("remove", "remove `shiny-busy` class from html tag")
  ),
  server = function(input, output, session) 
    observeEvent(input$add, 
      shinyjs::addClass(selector = "html", class = "shiny-busy")
    )
    observeEvent(input$remove, 
      shinyjs::removeClass(selector = "html", class = "shiny-busy")
    )    
  
))

【讨论】:

太棒了!!!!!!!!!!!!!!!!!!!!!!!!!我收到错误消息“找不到会话”,并且花了一天的大部分时间才意识到问题出在服务器中。R 我没有会话作为参数。 如果您使用最新版本的 shinyjs(来自 GitHub,而不是来自 CRAN - 使用 devtools::install_github("daattali/shinyjs") 下载它),那么您不再需要 session 变量

以上是关于我可以动态设置html类吗?或者 Shiny 是如何设置 'html'.hasClass('Shiny-busy') 的?的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny动态盒子高度

您可以在 C++ 中动态分配带有向量作为字段的类吗?

Logback - 你能从 env 变量中定义 appender 名称和类吗?

我可以在 Django 设置中定义类吗?如何在测试中覆盖这些设置?

从 R Shiny App 输出纯 HTML 文件

使用 R/Shiny 创建动态数量的输入元素