如何从多个文本框输入中读取字符串并将它们存储在 Shiny 中的向量中?
How can I read strings from a multiple textboxinputs and store them in a vector in Shiny?
I have a few text boxes with single characters in them which will be inputted by the user。我一直在试图弄清楚如何将这些值存储在一个向量中。例如,如果用户在框中输入值 B A C D A,那么我的向量应该看起来像 x<- c(B,A,C,D,A).
编辑:我更新了下面的代码。我没有先更新它,因为它有点长。该代码基本上会获得与数据集中的列一样多的复选框。如果你勾选一个复选框,那么你会得到 2 textboxinput 和 dropdownmenu
UI:
library(shiny)
library(DT)
shinyUI(
navbarPage(title="Analysis",
tabPanel(title="Input",
sidebarLayout(
sidebarPanel(
fileInput("file","Upload the file"),
checkboxInput('file_has_headers',"Take Column Names from the first row of the file",value= TRUE),
checkboxInput('show_head_only',"Display only first 6 rows. Uncheck this to see entire file",value= TRUE),
radioButtons(inputId = 'sep', label = 'Separator', choices = c(Comma=',',Semicolon=';',Tab='\t', Space=''), selected = ','),
textAreaInput("domains", 'Enter the comma seperated list of dimensions, for example: verbal ability, numerical ability' ),
width = 4
),
mainPanel(
wellPanel(
DT::dataTableOutput("uploaded_table"
),# Displays the uploaded table by using js dataTable from DT package
),
width = 8
),
position = 'left'
)
), #End of Input Tab panel
tabPanel(title="Verification",
fillCol(uiOutput('choose_columns')),
## end of fillRow
), #End of Verification Tab Panel
navbarMenu(title="Analayis",
tabPanel(title="Item Analysis", "content"
), #End of Item Analysis Tab Panel
tabPanel(title="Test Analysis", "content"
) #End of Test Analysis Tab Panel
) #End of navbarMenu
) #End of navbarPage
) #end of shinyUI
服务器:
library(shiny)
library(DT)
options(shiny.maxRequestSize=300*1024^2)
shinyServer(function(input, output) {
#1: Get the uploaded file in the data variable
data <- reactive({
uploaded <- input$file
#if(is.null(file1)){return("No file is selected or selected file is not in the right format. Please check the documentation and upload correct file.")}
req(uploaded) #req retruns a silence rather than error and is better than using if()
if(input$show_head_only){
head(read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)) #head() returns only first 6 rows
} else {
read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)
}
})
#3: set element to show the uploaded csv file as a table
output$uploaded_table<- DT::renderDataTable(
data(), # If a variable contains the output of reactive() function, it must be used as a function.
server=TRUE, #Important to keep this as true so that large datasets do not crash the browser
options = list(
scrollX = TRUE
),
) # End of uploaded table output setting
#4: Set dynamic checkboxes based on the number of columns in the data
output$choose_columns <- renderUI({
n <- length(names(data()))
colnames <- names(data())
items <- strsplit(input$domains,',')[[1]]
tagList(
lapply(1:n, function(i){
div(
div(style="display: inline-block; vertical-align:top; width: 150px ;",checkboxInput(paste0('Columns', i),"", value = TRUE )),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('answer_key', i),"",placeholder = 'e.g. A')),
div(style="display: inline-block; vertical-align:top; width: 150px ;",selectInput(inputId = "domains", label = "", choices = items)),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('valid_options',i),"",placeholder = 'e.g. A,B,C,D'))
)
})
)
})
})
要将输入作为向量获取,您可以在 server
代码中使用以下内容。
vec <- sapply(gtools::mixedsort(grep('answer_key',names(input), value = TRUE)),
function(x) input[[x]])
完整的应用程序代码 -
library(shiny)
library(DT)
ui <-
navbarPage(title="Analysis",
tabPanel(title="Input",
sidebarLayout(
sidebarPanel(
fileInput("file","Upload the file"),
checkboxInput('file_has_headers',"Take Column Names from the first row of the file",value= TRUE),
checkboxInput('show_head_only',"Display only first 6 rows. Uncheck this to see entire file",value= TRUE),
radioButtons(inputId = 'sep', label = 'Separator', choices = c(Comma=',',Semicolon=';',Tab='\t', Space=''), selected = ','),
textAreaInput("domains", 'Enter the comma seperated list of dimensions, for example: verbal ability, numerical ability' ),
width = 4
),
mainPanel(
wellPanel(
DT::dataTableOutput("uploaded_table"
),# Displays the uploaded table by using js dataTable from DT package
),
width = 8
),
position = 'left'
)
), #End of Input Tab panel
tabPanel(title="Verification",
fillCol(uiOutput('choose_columns')),
textOutput('text')
## end of fillRow
), #End of Verification Tab Panel
navbarMenu(title="Analayis",
tabPanel(title="Item Analysis", "content"
), #End of Item Analysis Tab Panel
tabPanel(title="Test Analysis", "content"
) #End of Test Analysis Tab Panel
) #End of navbarMenu
) #End of navbarPage
server <- function(input, output) {
#1: Get the uploaded file in the data variable
data <- reactive({
uploaded <- input$file
#if(is.null(file1)){return("No file is selected or selected file is not in the right format. Please check the documentation and upload correct file.")}
req(uploaded) #req retruns a silence rather than error and is better than using if()
if(input$show_head_only){
head(read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)) #head() returns only first 6 rows
} else {
read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)
}
})
#3: set element to show the uploaded csv file as a table
output$uploaded_table<- DT::renderDataTable(
data(), # If a variable contains the output of reactive() function, it must be used as a function.
server=TRUE, #Important to keep this as true so that large datasets do not crash the browser
options = list(
scrollX = TRUE
),
) # End of uploaded table output setting
#4: Set dynamic checkboxes based on the number of columns in the data
output$choose_columns <- renderUI({
n <- length(names(data()))
colnames <- names(data())
items <- strsplit(input$domains,',')[[1]]
tagList(
lapply(1:n, function(i){
div(
div(style="display: inline-block; vertical-align:top; width: 150px ;",checkboxInput(paste0('Columns', i),"", value = TRUE )),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('answer_key', i),"",placeholder = 'e.g. A')),
div(style="display: inline-block; vertical-align:top; width: 150px ;",selectInput(inputId = "domains", label = "", choices = items)),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('valid_options',i),"",placeholder = 'e.g. A,B,C,D'))
)
})
)
})
output$text <- renderText({
vec <- sapply(gtools::mixedsort(grep('answer_key', names(input), value = TRUE)), function(x) input[[x]])
vec
})
}
shinyApp(ui, server)
I have a few text boxes with single characters in them which will be inputted by the user。我一直在试图弄清楚如何将这些值存储在一个向量中。例如,如果用户在框中输入值 B A C D A,那么我的向量应该看起来像 x<- c(B,A,C,D,A).
编辑:我更新了下面的代码。我没有先更新它,因为它有点长。该代码基本上会获得与数据集中的列一样多的复选框。如果你勾选一个复选框,那么你会得到 2 textboxinput 和 dropdownmenu
UI:
library(shiny)
library(DT)
shinyUI(
navbarPage(title="Analysis",
tabPanel(title="Input",
sidebarLayout(
sidebarPanel(
fileInput("file","Upload the file"),
checkboxInput('file_has_headers',"Take Column Names from the first row of the file",value= TRUE),
checkboxInput('show_head_only',"Display only first 6 rows. Uncheck this to see entire file",value= TRUE),
radioButtons(inputId = 'sep', label = 'Separator', choices = c(Comma=',',Semicolon=';',Tab='\t', Space=''), selected = ','),
textAreaInput("domains", 'Enter the comma seperated list of dimensions, for example: verbal ability, numerical ability' ),
width = 4
),
mainPanel(
wellPanel(
DT::dataTableOutput("uploaded_table"
),# Displays the uploaded table by using js dataTable from DT package
),
width = 8
),
position = 'left'
)
), #End of Input Tab panel
tabPanel(title="Verification",
fillCol(uiOutput('choose_columns')),
## end of fillRow
), #End of Verification Tab Panel
navbarMenu(title="Analayis",
tabPanel(title="Item Analysis", "content"
), #End of Item Analysis Tab Panel
tabPanel(title="Test Analysis", "content"
) #End of Test Analysis Tab Panel
) #End of navbarMenu
) #End of navbarPage
) #end of shinyUI
服务器:
library(shiny)
library(DT)
options(shiny.maxRequestSize=300*1024^2)
shinyServer(function(input, output) {
#1: Get the uploaded file in the data variable
data <- reactive({
uploaded <- input$file
#if(is.null(file1)){return("No file is selected or selected file is not in the right format. Please check the documentation and upload correct file.")}
req(uploaded) #req retruns a silence rather than error and is better than using if()
if(input$show_head_only){
head(read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)) #head() returns only first 6 rows
} else {
read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)
}
})
#3: set element to show the uploaded csv file as a table
output$uploaded_table<- DT::renderDataTable(
data(), # If a variable contains the output of reactive() function, it must be used as a function.
server=TRUE, #Important to keep this as true so that large datasets do not crash the browser
options = list(
scrollX = TRUE
),
) # End of uploaded table output setting
#4: Set dynamic checkboxes based on the number of columns in the data
output$choose_columns <- renderUI({
n <- length(names(data()))
colnames <- names(data())
items <- strsplit(input$domains,',')[[1]]
tagList(
lapply(1:n, function(i){
div(
div(style="display: inline-block; vertical-align:top; width: 150px ;",checkboxInput(paste0('Columns', i),"", value = TRUE )),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('answer_key', i),"",placeholder = 'e.g. A')),
div(style="display: inline-block; vertical-align:top; width: 150px ;",selectInput(inputId = "domains", label = "", choices = items)),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('valid_options',i),"",placeholder = 'e.g. A,B,C,D'))
)
})
)
})
})
要将输入作为向量获取,您可以在 server
代码中使用以下内容。
vec <- sapply(gtools::mixedsort(grep('answer_key',names(input), value = TRUE)),
function(x) input[[x]])
完整的应用程序代码 -
library(shiny)
library(DT)
ui <-
navbarPage(title="Analysis",
tabPanel(title="Input",
sidebarLayout(
sidebarPanel(
fileInput("file","Upload the file"),
checkboxInput('file_has_headers',"Take Column Names from the first row of the file",value= TRUE),
checkboxInput('show_head_only',"Display only first 6 rows. Uncheck this to see entire file",value= TRUE),
radioButtons(inputId = 'sep', label = 'Separator', choices = c(Comma=',',Semicolon=';',Tab='\t', Space=''), selected = ','),
textAreaInput("domains", 'Enter the comma seperated list of dimensions, for example: verbal ability, numerical ability' ),
width = 4
),
mainPanel(
wellPanel(
DT::dataTableOutput("uploaded_table"
),# Displays the uploaded table by using js dataTable from DT package
),
width = 8
),
position = 'left'
)
), #End of Input Tab panel
tabPanel(title="Verification",
fillCol(uiOutput('choose_columns')),
textOutput('text')
## end of fillRow
), #End of Verification Tab Panel
navbarMenu(title="Analayis",
tabPanel(title="Item Analysis", "content"
), #End of Item Analysis Tab Panel
tabPanel(title="Test Analysis", "content"
) #End of Test Analysis Tab Panel
) #End of navbarMenu
) #End of navbarPage
server <- function(input, output) {
#1: Get the uploaded file in the data variable
data <- reactive({
uploaded <- input$file
#if(is.null(file1)){return("No file is selected or selected file is not in the right format. Please check the documentation and upload correct file.")}
req(uploaded) #req retruns a silence rather than error and is better than using if()
if(input$show_head_only){
head(read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)) #head() returns only first 6 rows
} else {
read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)
}
})
#3: set element to show the uploaded csv file as a table
output$uploaded_table<- DT::renderDataTable(
data(), # If a variable contains the output of reactive() function, it must be used as a function.
server=TRUE, #Important to keep this as true so that large datasets do not crash the browser
options = list(
scrollX = TRUE
),
) # End of uploaded table output setting
#4: Set dynamic checkboxes based on the number of columns in the data
output$choose_columns <- renderUI({
n <- length(names(data()))
colnames <- names(data())
items <- strsplit(input$domains,',')[[1]]
tagList(
lapply(1:n, function(i){
div(
div(style="display: inline-block; vertical-align:top; width: 150px ;",checkboxInput(paste0('Columns', i),"", value = TRUE )),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('answer_key', i),"",placeholder = 'e.g. A')),
div(style="display: inline-block; vertical-align:top; width: 150px ;",selectInput(inputId = "domains", label = "", choices = items)),
div(style="display: inline-block; vertical-align:top; width: 150px ;",textInput(paste0('valid_options',i),"",placeholder = 'e.g. A,B,C,D'))
)
})
)
})
output$text <- renderText({
vec <- sapply(gtools::mixedsort(grep('answer_key', names(input), value = TRUE)), function(x) input[[x]])
vec
})
}
shinyApp(ui, server)