如何使用 lapply 在 shiny 中存储输出?
How can I store the output using lapply in shiny?
我正在构建一个允许用户提交足球运动员阵型的应用程序。玩家名称存储在 .csv 文件中。这些名称被读入,然后作为 select 输入的输入。用户应该首先 select 编队,然后根据 selected 编队 select 输入名称。通过使用 lapply.
这非常有效(在下面的示例中有 2 select 输入)
我现在的问题是我想将 selected 名称存储在一个变量中以进一步使用它们。变量 myval 应该存储 selected 名称。它以某种方式仅适用于第一个 select 输入的第一个 selected 名称。
我的意思是这有效并在第一个 select 输入中存储名称 selected:
myval <- eventReactive(input$i[1],
{input$i[1]})
但这行不通:
myval <- eventReactive(input$i[2],
{input$i[2]})
您可以在下面找到完整的代码。
非常感谢!
ui.R:
fluidPage(
#Dropdown
selectInput("Formation", label = "Formation", choice = c("",433,343)),
#Output
uiOutput(outputId = "select_formation")
)
server.R:
function(input, output, session){
#input_names <- read.csv("temp.csv",TRUE,";")
input_names <- structure(list(Goalkeeper = c("-", "Max", "Mo", "Tobi", "", "",
""), Defender = c("-", "Bob", "Julius", "Mat", "Hans", "Peter",
"Tom")), class = "data.frame", row.names = c(NA, -7L))
output$select_formation = renderUI(
if(input$Formation == 433){
lapply(1:2,function(i){
selectInput(inputId = "i", label = names(input_names[i]), choices = c(input_names[,i]))
})
})
myval <- eventReactive(input$i[2],
{input$i[2]})
}
感谢您提供数据。这是一个可能有用的工作示例。
动态创建的 selectInput
的 inputId
是由 paste0("id", i)
创建的,因此您的示例中将有 id1
和 id2
。
你的myval
reactive
表达式可以通过lapply
再次获取输入值列表,使用相同的ids作为参考。
library(shiny)
ui <- fluidPage(
selectInput("Formation", label = "Formation", choice = c("",433,343)),
uiOutput(outputId = "select_formation"),
uiOutput("select_inputs")
)
server <- function(input, output, session) {
output$select_formation = renderUI(
if(input$Formation == 433){
lapply(1:2, function(i){
selectInput(inputId = paste0("id", i), label = names(input_names[i]), choices = c(input_names[i]))
})
})
myval <- reactive({
lapply(1:2, function(i) {
input[[paste0("id", i)]]
})
})
output$select_inputs <- renderUI({
paste("You selected: ", paste(myval(), collapse = ", "))
})
}
shinyApp(ui, server)
我正在构建一个允许用户提交足球运动员阵型的应用程序。玩家名称存储在 .csv 文件中。这些名称被读入,然后作为 select 输入的输入。用户应该首先 select 编队,然后根据 selected 编队 select 输入名称。通过使用 lapply.
这非常有效(在下面的示例中有 2 select 输入)
我现在的问题是我想将 selected 名称存储在一个变量中以进一步使用它们。变量 myval 应该存储 selected 名称。它以某种方式仅适用于第一个 select 输入的第一个 selected 名称。
我的意思是这有效并在第一个 select 输入中存储名称 selected:
myval <- eventReactive(input$i[1],
{input$i[1]})
但这行不通:
myval <- eventReactive(input$i[2],
{input$i[2]})
您可以在下面找到完整的代码。 非常感谢!
ui.R:
fluidPage(
#Dropdown
selectInput("Formation", label = "Formation", choice = c("",433,343)),
#Output
uiOutput(outputId = "select_formation")
)
server.R:
function(input, output, session){
#input_names <- read.csv("temp.csv",TRUE,";")
input_names <- structure(list(Goalkeeper = c("-", "Max", "Mo", "Tobi", "", "",
""), Defender = c("-", "Bob", "Julius", "Mat", "Hans", "Peter",
"Tom")), class = "data.frame", row.names = c(NA, -7L))
output$select_formation = renderUI(
if(input$Formation == 433){
lapply(1:2,function(i){
selectInput(inputId = "i", label = names(input_names[i]), choices = c(input_names[,i]))
})
})
myval <- eventReactive(input$i[2],
{input$i[2]})
}
感谢您提供数据。这是一个可能有用的工作示例。
动态创建的 selectInput
的 inputId
是由 paste0("id", i)
创建的,因此您的示例中将有 id1
和 id2
。
你的myval
reactive
表达式可以通过lapply
再次获取输入值列表,使用相同的ids作为参考。
library(shiny)
ui <- fluidPage(
selectInput("Formation", label = "Formation", choice = c("",433,343)),
uiOutput(outputId = "select_formation"),
uiOutput("select_inputs")
)
server <- function(input, output, session) {
output$select_formation = renderUI(
if(input$Formation == 433){
lapply(1:2, function(i){
selectInput(inputId = paste0("id", i), label = names(input_names[i]), choices = c(input_names[i]))
})
})
myval <- reactive({
lapply(1:2, function(i) {
input[[paste0("id", i)]]
})
})
output$select_inputs <- renderUI({
paste("You selected: ", paste(myval(), collapse = ", "))
})
}
shinyApp(ui, server)