我正在寻找一些帮助理解闪亮的反应性-我的非常基本的例子工作,但我有一种感觉,这是不正确的方式去做事情。我已经通读了这里的例子,它解释了observe
和reactive
的不同行为。但在我的例子中,我把它们结合使用了——我想知道如果和为什么,那是我不应该做的事情!
我的方法-这是不正确的吗?
我已经捕获了模块中动作按钮的反应值(见下面的完整代码),并使用reactive()
将其分配给我的reactiveValues
列表。
navigation_values <- reactiveValues()
navigation_values$button1 = reactive(input$navigate)
这个反应列表然后返回到应用服务器,然后我使用navigation_values$button1()
访问值。这是有效的(对于这个小例子)-但与所有闪亮的文档/小插图不同,我看到的是…
observeEvent(input$navigate, {
navigation_values$button1 = input$navigate
})
然后是通过navigation_values$button1
访问的值
感谢任何帮助!我不确定这是否是一个"哲学"问题。问题,或者如果我将我的方法扩展到一个更彻底的例子,是否会立即导致问题。
完整代码
library(shiny)
library(shinydashboard)
# update values module -------------------------------------
module_ui <- function(id){
ns <- NS(id)
tagList(
actionButton(inputId = ns("navigate"),
label = "Go to page 2")
)
}
module_server <- function(id){
moduleServer(id, function(input, output, session){
navigation_values <- reactiveValues()
navigation_values$button1 = reactive(input$navigate)
return(navigation_values)
})
}
# UI --------------------------------------------
sidebar <- dashboardSidebar(
sidebarMenu(
id = "mastertabs",
menuItem(
text = "Page 1",
tabName = "page1"),
menuItem(
text = "Page 2",
tabName = "page2")))
body <- dashboardBody(
tabItems(
tabItem(
tabName = "page1",
fluidPage(module_ui("mymodule"))
)))
ui <- dashboardPage(
dashboardHeader(title = "PRACTICE"),
sidebar,
body
)
# Server ------------------------
server <- function(input, output, session){
navigation_values <- module_server("mymodule")
observeEvent(navigation_values$button1(), {
updateTabsetPanel(session, inputId = "mastertabs", selected = "page2")
})
}
shinyApp(ui = ui, server = server)
我认为最好的方法是:
moduleServer(id, function(input, output, session){
return(reactive(input$navigate)
})
然后,在你的应用程序中,只需调用:
navigation_values()