闪亮 - 用户在看什么页面?

时间:2021-03-26 16:59:28

标签: r shiny flexdashboard

如何确定用户是否正在查看 flexdashboard 中的特定页面?我有一个全局侧边栏过滤器面板,适用于所有页面,但侧边栏中的过滤器之一不适用于其中一个页面。在此示例中,假设我不希望在第 3 页上显示 selectInput()

---
title: "Which Page?"
runtime: shiny
output: flexdashboard::flex_dashboard
---

Sidebar {.sidebar data-width=400}
=====================================
```{r}
textInput("text", NULL)

selectInput("select", NULL, LETTERS[1:5])
```

Page 1
=====================================

Page 2
=====================================

Page 3
=====================================

我希望使用 session$clientData$url_hash 但这是静态的并且基于用户最初打开的页面。你可以把它放在侧边栏部分,看看它是如何(不)改变的。我发现的其他想法是在 js 中使用 window.locationis.visible 但不确定如何集成。

print_info <- function(x) {
  allvalues <- 
    lapply(
      X = sort(names(x)), 
      FUN = function(name) {
        item <- x[[name]]
        paste(name, item, sep = " = ")
      }
    )
  
  paste(allvalues, collapse = "\n")
}
    
output$client_data <- renderText(print_info(session$clientData))
verbatimTextOutput("client_data")

1 个答案:

答案 0 :(得分:0)

解决方案1:“纯闪亮”

您可以利用 renderXXX() 仅在活动页面上计算这一事实。例如,我们可以在每个页面上使用 renderUI() 来更新具有当前页码的反应值 tab。然后在侧栏中使用该值来检查 selectInput 是否与 renderUI 一起显示:

---
title: "Which Page?"
runtime: shiny
output: flexdashboard::flex_dashboard
---

Sidebar {.sidebar data-width=400}
=====================================
```{r}
textInput("text", NULL)

tab <- reactiveVal(1)
renderUI({
  if(tab()!=3)
    selectInput("select", NULL, LETTERS[1:5])
})
```

Page 1
=====================================
```{r}
renderUI({tab();tab(1);NULL})
```

Page 2
=====================================
```{r}
renderUI({tab();tab(2);NULL})
```

Page 3
=====================================
```{r}
renderUI({tab();tab(3);NULL})
```

解决方案 2:使用 JavaScript

您也可以使用 JS 事件

(注意使用 is.null() 作为事件不会在第 1 页初始显示时触发):

---
title: "Which Page?"
runtime: shiny
output: flexdashboard::flex_dashboard
---

<script>
$("body").on("shown.bs.tab", "a[data-toggle='tab']", function(e) {
   Shiny.setInputValue("active_tab", $(e.target).parent().index() + 1);
})
</script>

Sidebar {.sidebar data-width=400}
=====================================
```{r}
textInput("text", NULL)

renderUI({
  if(is.null(input$active_tab) || input$active_tab!=3)
    selectInput("select", NULL, LETTERS[1:5])
})
```

Page 1
=====================================

Page 2
=====================================

Page 3
=====================================