【问题标题】:R Shiny - Construct Two Variables with One ReactiveR Shiny - 用一个反应构造两个变量
【发布时间】:2021-01-07 21:11:27
【问题描述】:

我有一个问题:在一个闪亮的应用程序中,我用一个 reactive() 构造了一个变量。问题是,在这个过程的中间(这是一个很长的过程)我构造了我也需要的其他变量。 例如:

#---------------UI------------------
ui <- navbarPage(
  title = "example",
  tabPanel('panel',
           tableOutput("my_table"),
           tableOutput("colum_names"))
) 

#---------------SERVER------------------
server <- function(input, output) {
  a <- reactive({
    df_1 <- data.frame("fc"=c(1,2,3), "sc"=c(1,2,3), "tc"=c(1,2,3) )
    df_2 <- subset(df_1,select=-c(fc))
    column_names <- colnames(df_2)
    df_3 <- df_2*2
    df_3
  })
  output$my_table = renderTable({
    a()
  })
  output$colum_names = renderTable({
    df_column_names = data.frame(column_names())
    df_column_names
  })
}

#---------------APP------------------
shinyApp(ui = ui, server = server)

在这个(非常短的)示例中,我需要变量“a”(当然)和变量“column_names”。我可以做一些事情,比如创建一个新的反应来重现所有过程,直到包含“column_names”的行并在那里完成。但是这个过程太长了,我更喜欢“高效”地做。

有什么想法吗??

非常感谢!

【问题讨论】:

    标签: r shiny reactive


    【解决方案1】:

    我为自己的问题找到了一个有趣的答案:如果你想做这样的事情,你可以使用“

    #---------------UI------------------
    ui <- navbarPage(
      title = "example",
      tabPanel('panel',
               tableOutput("my_table"),
               tableOutput("colum_names"))
    ) 
    
    #---------------SERVER------------------
    server <- function(input, output) {
      a <- reactive({
        df_1 <- data.frame("fc"=c(1,2,3), "sc"=c(1,2,3), "tc"=c(1,2,3) )
        df_2 <- subset(df_1,select=-c(fc))
        column_names <- colnames(df_2)
        # HERE THE SOLUTION!!
        column_names_saved <<- column_names
        df_3 <- df_2*2
        df_3
      })
      output$my_table = renderTable({
        a()
      })
      output$colum_names = renderTable({
        df_column_names = data.frame(column_names_saved)
        df_column_names
      })
    }
    
    #---------------APP------------------
    shinyApp(ui = ui, server = server)
    

    然后,进入函数你必须继续使用变量“column_names”,但是当你以后需要使用它时,你可以使用“column_name_saved”。 (请注意一件事:一旦将变量保存到函数中,就无法更改它)

    谢谢!!!

    【讨论】:

      【解决方案2】:

      您描述的过程是正确的:不是分配变量,而是分配反应式,Shiny 将处理它们之间的依赖关系。

      请注意,在您提供的示例中,不需要响应式,因为内容到目前为止是静态的。

      library(shiny)
      #---------------UI------------------
      ui <- navbarPage(
        title = "example",
        tabPanel('panel',
                 tableOutput("my_table"),
                 tableOutput("column_names"))
      ) 
      
      #---------------SERVER------------------
      server <- function(input, output) {
        
        df_1 <- data.frame("fc"=c(1,2,3), "sc"=c(1,2,3), "tc"=c(1,2,3) )
        
        a <- reactive({subset(df_1,select=-c(fc))})
        
        column_names <- reactive({colnames(a())})
      
        output$my_table = renderTable({a()})
        
        output$column_names = renderTable({column_names()})
      }
      
      #---------------APP------------------
      shinyApp(ui = ui, server = server)
      

      【讨论】:

      • 感谢您的回答!对不起,我放了df_3并没有在示例中使用它,我只是更改了它。但问题是我在代码的中间,reactive() 中有变量“column_names”,我正在寻找一个选项,允许我使用该变量而不会破坏部分代码。这可能吗?
      • 查看我的编辑:只需制作 2 个响应式,Shiny 将处理它们之间的依赖关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多