我想在shiny包中提出与 renderUI()相关的问题。我创建了一个闪亮的应用程序,它允许用户上传数据文件并过滤数据。基于过滤器,我的闪亮应用程序创建了一个ggplot2图形。
数据
我的数据文件看起来像这样。为了给你一些想法,我留下以下代码。请注意,所有列都在这里。
user_id <- round(runif(100, 1, 100))
latitude <- runif(100, 0.0, 90.0)
longitude <- runif(100, 0.0, 180.0)
dates <- rep(c("2014-07-01", "2014-07-02"), each = 50, length = 100)
foo <- data.frame(cbind(user_id, latitude, longitude, dates), stringsAsFactors = FALSE)
初始尝试(失败)
我写了对开服务器.R和ui.R.它们允许我上传数据文件。但是,R不会过滤数据并创建图形。没有错误消息。
server.R
library(shiny)
library(data.table)
library(plyr)
library(dplyr)
library(ggplot2)
shinyServer(function(input,output) {
### Let users to choose and upload a file.
dataSet <- reactive({
if (is.null(input$file1)) {
return(NULL)
}
fread(input$file1$datapath)
})
### Now I want to create a chunk of code which filters a date set using date information
ana <- reactive({
if (is.null(dataSet)){
return(NULL)
}
dataSet() %>%
filter(dates >= input$inVar2[1], dates <= input$inVar2[2]) %>%
group_by(user_id, dates) %>%
summarize(count = n())
})
output$theGraph <- renderPlot ({
theGraph <- ggplot(ana(), aes(factor(format(dates, format = "%m%d")), count)) +
geom_boxplot() +
xlab("Dates") +
ylab("Appliacation usage (times)") +
ggtitle("How many times did each user use the app each day?")
print(theGraph)
})
})
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel("Test"),
sidebarLayout(
sidebarPanel(
fileInput("file1", "Choose file to upload",
accept = c(
"text/csv",
"text/comma-separated-values",
"text/tab-separated-values",
"text/plain",
".csv",
".tsv"
)),
dateRangeInput("inVar2", label = "Date range",
start = "2014-07-01", end = "2014-07-10")
),
mainPanel(plotOutput("theGraph"))
)
))
第二次尝试(成功)
我搜索了堆栈溢出并找到了以下两个帖子,这实际上帮我写了以前的服务器.R。我想对贡献者表示感谢。有一次,我仔细阅读,我意识到我可能需要使用 renderUI()来创建我想要的应用程序。解决方案是使用 renderUI()并将 dateRangeInput()放在其中。
两个链接
shiny r: numericInput from the uploaded data
R shiny passing reactive to selectInput choices
server.R
library(shiny)
library(data.table)
library(dplyr)
library(ggplot2)
shinyServer(function(input, output) {
### Let users choose and upload a file.
dataSet <- reactive({
if (is.null(input$file1)) {
return(NULL)
}
fread(input$file1$datapath)
})
### Let users choose a date range.
output$inVar2 <- renderUI({
if (is.null(dataSet)) {
return(NULL)
}
dateRangeInput("inVar2", label = h3("Date range"),
start = "2014-07-01", end = "2014-07-10")
})
### Based on the date range, filter the data.
ana <- reactive({
if (is.null(dataSet)) {
return(NULL)
}
dataSet() %>%
filter(dates >= input$inVar2[1], dates <= input$inVar2[2]) %>%
group_by(user_id, dates) %>%
summarize(count = n())
})
### Draw a graphic
output$theGraph <- renderPlot ({
print(ana())
theGraph <- ggplot(ana(), aes(factor(format(dates, format = "%m%d")), count)) +
geom_boxplot() +
ggtitle("How many times did each user\n use the app each day?") +
xlab("Dates") +
ylab("Appliacation usage\n (times)") +
theme(plot.title = element_text(size = 25, lineheight=.8, face="bold")) +
theme(axis.text.x = element_text(angle=90, color = "black", face = "bold", size = 10)) +
theme(axis.title.x = element_text(face="bold", color = "black", size=20)) +
theme(axis.title.y = element_text(face="bold", color = "black", size=20))
print(theGraph)
})
})
ui.R
shinyUI(
fluidPage(
titlePanel("Application usage summary"),
plotOutput("theGraph"),
hr(),
fluidRow(
column(3,
fileInput("file1", h3("Choose file to upload"),
accept = c(
"text/csv",
"text/comma-separated-values",
"text/tab-separated-values",
"text/plain",
".csv",
".tsv")
)),
column(3,
uiOutput("inVar2"))
)
))
我很高兴看到我的闪亮应用程序正常运行。但是,我想知道为什么我的第一次尝试不对。如果您在'shinyServer(函数(输入,输出){'部分之前上传文件,我认为我的第一种方法可行。但是,似乎无论何时允许用户上传文件,您都需要 renderUI()
主要问题
有没有什么方法可以使用我的第一种方法(失败方法)创建我的应用程序类型?如果有方法,它们会是什么?如果没有,我想了解更多关于 renderUI()的信息,此时CRAN手册中似乎需要更多信息。
次要问题
运行此应用程序时,我会在上传文件之前看到此错误消息。一旦上传数据文件,它就会消失。 (这已经解决。拼写错误导致整个剧本。)
错误:没有适用于“过滤器”的方法应用于类的对象 “NULL”
这个问题的答案是使用验证。
dataSet <- reactive({
validate(
need(input$file1 != "", "Please select a data set")
)
fread(input$file1$datapath)
})