使闪亮的模块反应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使闪亮的模块反应相关的知识,希望对你有一定的参考价值。

下面的示例应用程序有两个闪亮的模块。第一个模块显示一个包含随机生成的值的表以及一个操作按钮,单击该按钮可生成新值。第二个模块显示第一个模块中生成的数据集。

如何使用第一个表更改第二个表?

谢谢。

app.R

library(shiny)
source("modules.R")

ui <- fluidPage(

  fluidRow(
    column(6, table1_moduleUI("table1")),
    column(6, table2_moduleUI("table2"))

  )

)

server <- function(input, output, session) {

  table1 <- callModule(table1_module, "table1")
  callModule(table2_module, "table2", table_data = table1$values)
}

shinyApp(ui, server)

modules.R

# Module for table 1

table1_moduleUI <- function(id){
  ns <- NS(id)

  tagList(
    tableOutput(ns("table")),
    actionButton(ns("submit"), label = "Change values")
  )
}

table1_module <- function(input, output, session) {

  table <- reactiveValues()

  observeEvent(input$submit, {
    table$values <- replicate(3, rnorm(10))
  }, ignoreNULL = FALSE)

  output$table <- renderTable({
    table$values
  })

  return(table)
}

# Module for table 2

table2_moduleUI <- function(id){

  ns <- NS(id)
  tableOutput(ns("table"))
}

table2_module <- function(input, output, session, table_data){

  output$table <- renderTable({
    table_data
  })
}
答案

第二个模块似乎在问题中缺失,但逻辑似乎是直截了当的。这里的问题是你在使用时将反应式表达式的value传递给第二个模块,

callModule(table2_module, "table2", table_data = table1$values)

相反,你想传递无功值,它告诉R在无功值改变时使输出无效,

callModule(table2_module, "table2", table_data = table1)

这是完整的应用程序,

library(shiny)

# Module for table 1

table1_moduleUI <- function(id){
  ns <- NS(id)

  tagList(
    tableOutput(ns("table")),
    actionButton(ns("submit"), label = "Change values")
  )
}

table2_moduleUI <- function(id){
  ns <- NS(id)
  tableOutput(ns("table"))
}

table1_module <- function(input, output, session) {

  table <- reactiveValues()

  observeEvent(input$submit, {
    table$values <- replicate(3, rnorm(10))
  }, ignoreNULL = FALSE)

  output$table <- renderTable({
    table$values
  })

  return(table)
}

table2_module <- function(input, output, session,table_data) {

  output$table <- renderTable({
    table_data
  })

}


ui <- fluidPage(

  fluidRow(
    column(6, table1_moduleUI("table1")),
    column(6, table2_moduleUI("table2"))
  )

)

server <- function(input, output, session) {

  table1 <- callModule(table1_module, "table1")
  callModule(table2_module, "table2", table_data = table1$values)
}

shinyApp(ui, server)

需要注意的是,如果您想要显示数据框,使用被动值似乎是过度的。当我们想要返回一个反应式表达式,初始化一个反应变量并在观察者中设置它时我们可以简单地使用reactive()eventReactive(),这就是它们的用途!所以让我们使用它。反应值有其空间,根据我的经验,相对谨慎使用。

library(shiny)

# Module for table 1

table1_moduleUI <- function(id){
  ns <- NS(id)

  tagList(
    tableOutput(ns("table")),
    actionButton(ns("submit"), label = "Change values")
  )
}

table2_moduleUI <- function(id){
  ns <- NS(id)
  tableOutput(ns("table"))
}

table1_module <- function(input, output, session) {

  table = eventReactive(input$submit, {
    replicate(3, rnorm(10))
  }, ignoreNULL = FALSE)

  output$table <- renderTable({
    table()
  })

  return(table)
}

table2_module <- function(input, output, session,table_data) {

  output$table <- renderTable({
    table_data()
  })

}


ui <- fluidPage(

  fluidRow(
    column(6, table1_moduleUI("table1")),
    column(6, table2_moduleUI("table2"))
  )

)

server <- function(input, output, session) {

  table1 <- callModule(table1_module, "table1")
  callModule(table2_module, "table2", table_data = table1)
}

shinyApp(ui, server)

以上是关于使闪亮的模块反应的主要内容,如果未能解决你的问题,请参考以下文章

闪亮/ rscript - 使用checkboxGroupInput整数列表的反应图不起作用

闪亮的:如何在闪亮的应用程序中添加反应栏

闪亮的反应情节失败

R中闪亮的反应选择输入

R 用 updateSelectInput 反应闪亮

如何在闪亮的应用程序中制作kable table reactive()?闪亮+ kable