Извлечение элементов из динамического интерфейса в R Shiny - PullRequest
0 голосов
/ 25 июня 2019

У меня есть несколько динамических текстовых элементов. Количество элементов определяется раскрывающимся списком. Я хотел бы объединить каждый из динамических текстовых элементов в список, но у меня возникли трудности.

Я попытался создать отдельный реактивный объект для объединения элементов.

server <-  function(input,output) {

  #define number of names and dynamic names
  output$input_ui1<- renderUI({
    num<- as.integer(input$num)
    lapply(1:num,
           function(i) {
             textInput(inputId = paste0("name",i ),
                       label= paste0("Name",i),
                       value= "enter name")

           })
  })

  #Names into list 
  names_list<-NULL  
  reactive({  
    for (i in 1:input$num ) {
      name<- input[[paste0("name",i)]]
      names_list<-c(names_list, name)
    }
  })


  #access first item of  list of names    
  output$test_text<-reactive({ 
    (names_list[1])  
  })

  #access first name    
  output$test_text2<-reactive({ 
    (input[["name1"]])  
  })



}


ui<- fluidPage(sidebarLayout(
  sidebarPanel(
    selectInput("num","select number of names",choices= seq(1, 10, 1)),
    uiOutput("input_ui1"),
    dateRangeInput("daterange1", "Date range:", start = "2001-01-01", end = "2010-12-31"),
    uiOutput("test_text"),
    uiOutput("test_text2")
  ),
  mainPanel()
))

shinyApp(ui=ui, server=server)

У меня есть два тестовых текста в моем пользовательском интерфейсе "test_test" и "test_test2". Я ожидаю, что оба будут отображать одно и то же, но только второе отображает имя, как и ожидалось.

1 Ответ

0 голосов
/ 26 июня 2019

Ваше использование reactives неверно. Для получения дополнительной информации см. Учебник .

Оригинальный код

#Names into list 
names_list<-NULL  
reactive({  
  for (i in 1:input$num ) {
    name<- input[[paste0("name",i)]]
    names_list<-c(names_list, name)
  }
})

Вот что происходит:

  1. Вы определяете names_list как NULL
  2. Вы определяете reactive, но он не назначен никаким объектам , поэтому вы не можете получить к нему доступ. names_list - это просто нереактивный объект со значением NULL.

Также эта часть действительно странная:

#access first item of  list of names    
output$test_text<-reactive({ 
  (names_list[1])  
})

test_text - это uiOutput, поэтому вы должны использовать renderUI.

Код замены:

Присвойте реактив names_list, затем получите доступ к нему через names_list()

# Names into list 
names_list <- reactive({  
  lapply(1:input$num, function(i) {
    input[[paste0("name",i)]]
  })
})

#access first item of  list of names    
output$test_text <- renderUI( {
  names_list()[[1]]
})
...