当您允许用户上传文件并过滤数据时,为什么需要renderUI?

时间:2014-08-09 05:42:42

标签: r 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)

})

0 个答案:

没有答案