R SHINY:服务器中同一renderUI的UI多用? [英] R shiny: multiple use in ui of same renderUI in server?

查看:8
本文介绍了R SHINY:服务器中同一renderUI的UI多用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在UI的多个选项卡中重用用户在第一个选项卡中提供的输入。

在服务器中使用renderUI并在我的不同选项卡中使用uiOutput调用其输出似乎不可能做到这一点。以下是可重现的代码

ui <- pageWithSidebar(
headerPanel("Hello !"),
sidebarPanel(
tabsetPanel(
tabPanel("a", 
textInput(inputId = "xyz", label = "abc", value = "abc")),
tabPanel("b", uiOutput("v.xyz"))
,tabPanel("b", uiOutput("v.xyz"))
)
),

mainPanel())

server <- function(input,output){
output$v.xyz <- renderUI({
input$xyz
})
}

runApp(list(ui=ui,server=server))

有没有其他方法可以实现这一点?

非常感谢您的任何建议。

HTML

您不能(不应该)在推荐答案文档中有两个具有相同ID的元素(无论是否使用SHINY)。当然,在使用SHINY时,拥有多个具有相同ID的元素将是有问题的。我还主观地认为,您可以通过使用有意义的变量名来大幅改进代码。

您想要对此输入做什么也不是很清楚。是否希望在多个选项卡上显示输入框?还是要在多个选项卡上显示的textInput的值?

如果是前者,在我看来,没有一种明显的方法可以在不违反"具有相同ID的多个元素"子句的情况下做到这一点。后者会简单得多(只需使用renderText并将其发送到verbatimOutput),但我认为这不是您要问的问题。

所以您真正需要的是同步的多个文本输入(具有不同的ID)。您可以使用如下内容在服务器上的单独观察器中执行此操作:

ui <- pageWithSidebar(
  headerPanel("Hello !"),
  sidebarPanel(
    tabsetPanel(
      tabPanel("a", 
               textInput(inputId = "text1", label = "text1", value = "")),
      tabPanel("b", 
               textInput(inputId = "text2", label = "text2", value = ""))
    )
  ),

  mainPanel()
)

INITIAL_VAL <- "Initial text"

server <- function(input,output, session){  
  # Track the current value of the textInputs. Otherwise, we'll pick up that
  # the text inputs are initially empty and will start setting the other to be
  # empty too, rather than setting the initial value we wanted.
  cur_val <- ""

  observe({
    # This observer depends on text1 and updates text2 with any changes
    if (cur_val != input$text1){
      # Then we assume text2 hasn't yet been updated
      updateTextInput(session, "text2", NULL, input$text1)
      cur_val <<- input$text1
    }
  })

  observe({
    # This observer depends on text2 and updates text1 with any changes
    if (cur_val != input$text2){
      # Then we assume text2 hasn't yet been updated
      updateTextInput(session, "text1", NULL, input$text2)
      cur_val <<- input$text2
    }
  })

  # Define the initial state of the text boxes  
  updateTextInput(session, "text1", NULL, INITIAL_VAL)
  updateTextInput(session, "text2", NULL, INITIAL_VAL)

}

runApp(list(ui=ui,server=server))
可能有一种比我正在跟踪的cur_val更清晰的方式来设置初始状态。但是我脑子里想不出什么,所以就是这样。

这篇关于R SHINY:服务器中同一renderUI的UI多用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆