从 R Shiny 中的 Dynamic UI 中提取元素
Extracting Elements from Dynamic UI in R Shiny
我有多个动态文本元素。元素的数量由下拉列表决定。我想将每个动态文本元素组合到一个列表中,但是很难。
我已经尝试创建一个单独的反应对象来组合这些项目。
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)
我的 UI "test_test" 和 "test_test2" 中有两个测试文本。我的期望是两者都应显示相同的内容,但只有第二个显示的是预期的名字。
您对 reactives
的用法不正确。有关详细信息,请参阅 tutorial.
原码
#Names into list
names_list<-NULL
reactive({
for (i in 1:input$num ) {
name<- input[[paste0("name",i)]]
names_list<-c(names_list, name)
}
})
事情是这样的:
- 您将
names_list
定义为 NULL
- 您定义了一个
reactive
,但 它没有分配给任何对象,因此您无法访问它。 names_list
只是一个 non-reactive 对象,其值为 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]]
})
我有多个动态文本元素。元素的数量由下拉列表决定。我想将每个动态文本元素组合到一个列表中,但是很难。
我已经尝试创建一个单独的反应对象来组合这些项目。
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)
我的 UI "test_test" 和 "test_test2" 中有两个测试文本。我的期望是两者都应显示相同的内容,但只有第二个显示的是预期的名字。
您对 reactives
的用法不正确。有关详细信息,请参阅 tutorial.
原码
#Names into list
names_list<-NULL
reactive({
for (i in 1:input$num ) {
name<- input[[paste0("name",i)]]
names_list<-c(names_list, name)
}
})
事情是这样的:
- 您将
names_list
定义为NULL
- 您定义了一个
reactive
,但 它没有分配给任何对象,因此您无法访问它。names_list
只是一个 non-reactive 对象,其值为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]]
})