【问题标题】:Shinyjs: On click option in shiny dashboardShinyjs:闪亮仪表板中的单击选项
【发布时间】:2016-02-13 03:23:04
【问题描述】:

我有一个闪亮的仪表板应用程序,带有 3 个选项卡和一个通知菜单。我正在尝试跟踪仪表板上的用户活动,并希望记录他们在仪表板上的每次点击。

标签集面板的server.R中的代码如下:

output$tabs1=renderUI(
    tabsetPanel(type="tab",
                tabPanel(id="OverallTab","Overall Activity"),
                tabPanel(id="Tab1","Tab 1 details"),
                tabPanel(id="Tab2","Tab 2 details"))

我的部分通知代码如下:

output$notiMenu <- renderMenu({
            all_nots <- apply(u_notd, 1, function(row) {
              notificationItem(text = row[["notification"]], icon("users"))
            })
            dropdownMenu(type = "notifications", .list = all_nots)
          })

如果用户单击以下任一选项卡或通知菜单,我正在尝试使用 shinyjs 写入数据框:

  tab1_clicled=""
  tab2_clicked=""
  noti_clicked=""
  shinyjs::onclick("notiMenu",print("Notification clicked"),noti_clicked="YES")
  shinyjs::onclick("Tab1",print("Tab1 clicked"),tab1_clicled="YES")
  shinyjs::onclick("Tab2", print("Tab2 clicked"),tab2_clicled="YES")
  df=as.data.frame(tab1_clicked,tab2_clicked,noti_clicked)

我在这里遇到两个问题,

1) on click 选项似乎不适用于选项卡面板,使用 shinyjs 参考 (here),我看到只有提到使用 on click 选项卡面板而不是每个标签面板?

2) 我无法在 onclick 函数中修改 tab1_clicked 的值。它抛出一个错误说:观察者中未处理的错误:未使用的参数(tab1_clicled =“YES”)

感谢任何帮助。

【问题讨论】:

    标签: shiny shinydashboard shinyjs


    【解决方案1】:

    我刚刚快速浏览了您的代码,发现两个错误。 onclick的第一个参数是元素的ID。在您的情况下,您需要实际选项卡按钮的 ID,但不幸的是选项卡的工作方式闪亮,“Tab1”实际上是选项卡面板容器的 ID,但它不是选项卡按钮本身的 ID。看看一个闪亮的应用程序的 HTML,你就会明白这一点。选项卡有点奇怪和烦人,并且很难处理闪亮的选项卡按钮本身。

    其次,onclick 的第二个参数是表达式,但您尝试运行两个表达式 print("Tab1 clicked")tab1_clicled="YES"。您需要将它们包装在 {} 中,以便将其视为一个表达式,如下所示:

    onclick(id, {print("Tab1 clicked"); tab1_clicled="YES"}

    但不幸的是,获取标签按钮的 id 很困难,所以我认为 onclick 对此没有用处

    【讨论】:

    • 感谢@daattali,它解决了用户单击通知时的跟踪问题,但仍然让我无法跟踪用户是否单击选项卡。我知道你提到过这样做的一种方法是写一行像 input$Tabs1 但我不知道在这种情况下在 RHS 上放什么。徒劳地我尝试了 if (input$tabs1==TRUE) 然后 tab1_clicked="YES"。但显然这行不通。有什么建议吗?感谢您的帮助。
    • 我不明白你在做什么,或者你不明白我的回答是什么?如果您希望在选择选项卡时发生某些事情,则无需使用onclick,您只需侦听由选项卡输入触发的反应事件即可。例如,如果您有一个 navbarPage,其 id 为“navbar”,并且您有两个标签,其 id 为“tab1”和“tab2”,那么您可以拥有一个 observe({ print(input$navbar) }),当您打开 tab1 和“tab2”时它会打印“tab1” " 当你打开 tab2.尝试一下。
    • 这正是我所需要的。再次感谢。你是一个很大的帮助@daattali
    猜你喜欢
    • 2021-12-07
    • 2017-03-21
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多