一个 Shiny 的应用程序,它接受用户输入并将列名称发送到 selectizeInput()
盒子。然后,用户选择几个列名称,并且将在同一应用程序的另一个部分/选项卡中创建数据子集。
应用程序的 UI 包含以下部分:
- 导航栏
- 导航栏的一个选项卡用于选择数据和列
- 用于创建数据子集和绘图的其他选项卡。
ui.R
library(markdown)
require(XLConnect)
shinyUI(fluidPage(
# Application title
img(class = "img-polaroid",
src = paste0(
"http://www.aithent.com/wp-content/uploads/2015/05/aithent-website-200x80.png"
)
),
navbarPage(
"Project Vanguard",
tabPanel(
"Table",
titlePanel("Select Data"),
sidebarLayout(
sidebarPanel(
selectInput(
"fileType",
"Select File Type:",
c("MS Excel Worksheet (xls,xlsx)" = "xls",
"Text/CSV (.csv)" = "csv")
),
fileInput(
'file1',
'Choose file to upload',
accept = c(
'text/csv',
'text/comma-separated-values',
'text/tab-separated-values',
'text/plain',
'.csv',
'.tsv',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'.xlsx',
'.xls'
)
),
tags$hr(),
checkboxInput('header', 'Header', TRUE),
radioButtons('sep', 'Separator',
c(Comma = ',',
Semicolon = ';',
Tab = '\t'
),','),
radioButtons(
'quote',
'Quote',
c(None = '',
'Double Quote' = '"',
'Single Quote' = "'"
),'"'
),
tags$hr(),
uiOutput("selector1"),
uiOutput("selector2")
),
mainPanel(dataTableOutput('table'))
)),
tabPanel("Plot",
sidebarLayout(
sidebarPanel(radioButtons(
"plotType", "Plot type",
c("Scatter" = "p", "Line" = "l"))),
mainPanel(dataTableOutput("ResultTab"),
plotOutput("plot")))),
navbarMenu("More",
tabPanel(
"Summary",
verbatimTextOutput("summary"))))
))
服务器.R
library(sqldf)
options(scipen = 999)
shinyServer(function(input, output, session){
output$plot <- renderPlot({
plot(data$Count, data$Sales, type = input$plotType)
})
output$summary <- renderPrint({
summary(data)
})
data <- reactive({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
if (input$fileType == 'csv') {
table1 <- read.csv(
inFile$datapath,
header = input$header,
sep = input$sep,
quote = input$quote
)
return(table1)
} else if (input$fileType == 'xls') {
table1 <- readWorksheetFromFile(inFile$datapath, sheet = 1)
}
})
output$table <- renderDataTable({
data()
})
output$selector1 <- renderUI({
selectizeInput("GroupVar",
"Choose Group Variables:",
as.list(colnames(data())),
multiple = TRUE)
})
output$selector2 <- renderUI({
selectizeInput("AnalysisVar",
"Choose Analysis Variables:",
as.list(colnames(data())),
multiple = TRUE)
})
ResultSet <- reactive({
Src <- data()
GVars <- as.character(input$selector1)
Avars <- as.character(input$selector2)
gvs <- paste(unlist(strsplit(GVars, ' ')), collapse = ",")
avs <-
paste0('sum(',
strsplit(Avars, ' '),
') as SumOf',
strsplit(Avars, ' '),
collapse = ",")
sqlStat <-
paste0("SELECT ", gvs, ',', avs, " FROM Src GROUP BY ", gvs)
Result <- sqldf(sqlStat)
return(Result)
})
output$ResultTab <- renderDataTable({
ResultSet()
})
})
在代码中,我收到以下错误:
Error in sqliteSendQuery(con, statement, bind.data) :
error in statement: near ",": syntax error
我想知道两件事我的 SQL 错误是因为:
1.数据传递不当,即响应式(Reactive)使用不正确ResultSet
通过Src<-data()
?
或者
2.selectizeInput()
的不当引用和使用通过声明GVars <- as.character(input$selector1)
?
最佳答案
要获取用户在selectize
中选择的内容,您需要引用selectizeInput
的id
。例如,您应该使用 input$GroupVar
而不是 input$selector1
。
您可以在 ResultSet
中添加 print(sqlStat)
以确保您的 SQL 语句正常。
响应式(Reactive)表达式也是闭包,要获取需要调用它们的值。例如,您的 renderPlot
应该是:
output$plot <- renderPlot({
plot(data()$Count,data()$Sales, type=input$plotType)
})
关于r - 如何在R Shiny 中将数据从一个 `reactive()`传递到另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627343/