【问题标题】:How to embed a Reactive Value in a matrix in the UI section of R Shiny?如何在 R Shiny 的 UI 部分的矩阵中嵌入反应值?
【发布时间】:2021-09-02 01:30:27
【问题描述】:

在下面的 MWE 代码中,我试图将反应值“周期”(从滑块输入生成并在服务器部分中定义)插入出现的用户输入矩阵的第一行和第一列在 UI 部分。正如您在下面看到的,矩阵的第一行/列的当前设置为“1”。我希望它与“句点”中的值相同,并且随着用户移动顶部滑块所影响的句点变化而发生反应。

我确定这需要对 Reactivity/observeEvent 有一定的了解,而我还没有。我用这些参数愚弄了无济于事。

另请参阅下面的图片以更好地解释。

library(shiny) 
library(shinyMatrix)

ui <- fluidPage(style = "margin-top:10px;",
    column(3, 
        fluidRow(
             sliderInput("periods", "Nbr of periods (X):",min = 1, max = 120, value = 60)),
      
        fluidRow(
            
            matrixInput(
              "vector_input",
              label = "Generate matrix:",
              value = matrix(c(1, # << this 1 value needs to be reactive input$periods value
                               0.2), 
                         1, 2, dimnames = list(NULL, c("Y", "Z"))),
              rows = list(extend = TRUE,  names = FALSE),
              cols = list(extend = FALSE, names = TRUE, editableNames = FALSE),
              class = "numeric"),
            
            textOutput("selected_var") 
    )),
    column(9,))

server <- function(input, output) {
  
  output$selected_var <- renderText({paste("Number of periods: ", input$periods)})
 
  vals <- reactiveValues()
  observe({vals$periods <- input$periods})
  
  vector_input  <-  reactive(input$vector_input)
 
} # close server

shinyApp(ui = ui, server = server)

这是运行草拟的代码时出现的内容,也是我想要做的事情。在第二张图片中,我展示了用户将输入的周期从 60 更改为 20,以及我希望矩阵 Y 列中的第一行如何反映这种变化:

【问题讨论】:

    标签: r shiny shiny-reactivity


    【解决方案1】:

    updateMatrixInput 函数为您提供了一个简单的解决方案。将您当前的服务器功能替换为

    server <- function(input, output, session) {
      output$selected_var <- renderText({paste("Number of periods: ", input$periods)})
      
      observeEvent(input$periods, {
        updateMatrixInput(session, "vector_input", value=matrix(c(input$periods, 0.2), 1, 2))
      })
    }
    

    而且我相信你会得到你想要的功能。请注意在server 函数的定义中添加了session 参数。

    【讨论】:

    • 谢谢你,伟大的 Limey! Stack Overflow 和像你这样乐于提供帮助的人让我深受鼓舞。
    • 快速问题 Limey:我添加了以下 2 行代码来创建一个用于测试目的的全局变量——periods
    • 算了!我刚刚想通了。我添加到服务器部分vector_input
    • 您可以将您的全局分配与对updateMatrixInput 的调用放在同一个observeEvent 中,并为自己节省几行代码。另外,请查看reactiveValues 而不是reactive-和-observe。我认为这会有所帮助...
    猜你喜欢
    • 2021-12-11
    • 2021-11-26
    • 2021-11-22
    • 2022-01-06
    • 2021-12-12
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多