传递参数以在Shiny中渲染函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传递参数以在Shiny中渲染函数相关的知识,希望对你有一定的参考价值。

如何将其他参数传递给Shiny中的反应式上下文?目的是在评估时将参数切换到反应上下文(“回调”)。

想想以下Shiny服务器代码。如何让output$some打印“some”,output$different打印“不同”等等?

for(i in c("some","different","values"){
  output[[i]] <- renderText({
  # i gets evaluated at some later point in time, 
  # and thus will always print "values"
  i
})
}

下面的示例旨在使两个渲染上下文对应于相应的反应值text1text2,但当然它只使两者都依赖于text2

library(shiny)
ui <- fluidPage(
   titlePanel("Test"),
   sidebarLayout(
      sidebarPanel(
      ),
      mainPanel(
        htmlOutput("text1"),
        textOutput("text2"),

        actionButton("test_btn1",label="test1"),
        actionButton("test_btn2",label="test2")
      )
   )
)
server <- function(input, output) {
  rv <- reactiveValues(
    "text1"=NULL,
    "text2"=NULL
  )
  bindings <- list(
    list("var"="text1",
         "function"=renderUI),
    list("var"="text2",
         "function"=renderText)
  )
  for(i in bindings){
    output[[i[["var"]]]] <- i[["function"]]({
      # i is always the second element unfortunately
      rv[[i[["var"]]]]
    })
  }
  observeEvent(input$test_btn1,{
    rv$text1 <- tags$p("new value 1")
  })
  observeEvent(input$test_btn2,{
    rv$text2 <- "new value 2"
  })
}
shinyApp(ui = ui, server = server)
答案

尝试使用Map()而不是for循环,以便通过每次迭代调用函数:

library(shiny)
ui <- fluidPage(
  titlePanel("Test"),
  sidebarLayout(
    sidebarPanel(
    ),
    mainPanel(
      htmlOutput("text1"),
      textOutput("text2"),

      actionButton("test_btn1",label="test1"),
      actionButton("test_btn2",label="test2")
    )
  )
)
server <- function(input, output) {
  rv <- reactiveValues(
   "text1"=NULL,
    "text2"=NULL
  )
  bindings <- list(
    list("var"="text1",
         "function"=renderUI),
    list("var"="text2",
         "function"=renderText)
  )

  Map(function(i){
    output[[bindings[[i]][["var"]]]] <- bindings[[i]][["function"]]({
      # i is always the second element unfortunately
      rv[[bindings[[i]][["var"]]]]

    })
  }, 1:2)
  observeEvent(input$test_btn1,{
    rv$text1 <- "new value 1"
  })
  observeEvent(input$test_btn2,{
    rv$text2 <- "new value 2"
  })
}
shinyApp(ui = ui, server = server)

以上是关于传递参数以在Shiny中渲染函数的主要内容,如果未能解决你的问题,请参考以下文章

表值函数作为参数传递以在 case 语句中生成输出

Excel:如何在 excel 中转义逗号以在另一个函数(具有多个参数)内传递一个函数(具有多个参数)

r:在 Flexdashboard 中使用 Shiny 渲染 Kable

在 URL 中传递参数以在 IOS 中返回 json

Shiny:无法渲染 js 文件

如何将存储的值作为列号参数传递以在 awk 中进行编辑?