Почему R Shiny выдает эту ошибку, когда выводит данные (ggplot2), возвращаемые функцией реагирования ()? - PullRequest
0 голосов
/ 09 июля 2019

Я работаю над приложением Shiny, которое получает входные данные (csv) от пользователя и отображает различные представления корреляции в наборе данных.Моя точечная диаграмма отображается, когда пользователь загружает файл, но сначала высвечивает сообщение об ошибке Error: no expression to parse.Кажется, что моя функция ggplot вызывается до того, как данные, возвращаемые функцией reactive(), завершат загрузку, поэтому ввод не определен.Это потому, что он выполняется асинхронно?

Я попытался добавить условные выражения, чтобы проверить, является ли реактивная функция getData() нулевой, перед выполнением графика, но ошибка все еще мигает перед успешным отображением графика.

ui.R

library(shiny)

fluidPage(
    titlePanel("Correlation Analyzer"),
    sidebarLayout(
        sidebarPanel(
            fileInput("file", "Choose Clean CSV File to Analyze (must include headers)",
                      accept = c("text/csv","text/comma-separated-values,text/plain",".csv")
            ),
            uiOutput("xvars"), # dropdowns for selecting variable names
            uiOutput("yvars"),
            checkboxGroupInput(inputId='corrType', label="Correlation Type", 
                               choices=c('Continuous - Continuous (Pearson)', "Categorical - Categorical (Kramer's V)", 
                                         'Continuous - Categorical (Correlation Ratio)'), 
                               selected = NULL, inline = FALSE, width = NULL)
        ),
        mainPanel(
            if (is.null(tableOutput("dataHead")) == FALSE) {
                plotOutput("scatter")
            }
        )
    )
)

server.R

library(shiny)
library(ggplot2)

function(input, output) {
    getData = reactive({
        inFile = input$file
        if (is.null(inFile)) {
            return(NULL) 
        }
        df = read.csv(inFile$datapath, header = TRUE)
        return(df)
    })

    output$dataHead = renderTable({
        return(head(getData()))
    })
    output$xvars =
        renderUI({ # send list of available variable name choices to UI
            selectInput(inputId='selected_xvar', label="Select X Variable", choices=colnames(getData()), selected=input$selected_xvar)
        })
    output$yvars =
        renderUI({
            selectInput(inputId='selected_yvar', label="Select Y Variable", choices=colnames(getData()), selected=input$selected_yvar)
        })

    output$scatter = renderPlot({
        selected_xvar = input$selected_xvar
        selected_yvar = input$selected_yvar

        df = getData()
        if (is.null(df)==FALSE) {
            ggplot(df, aes_string(x=selected_xvar, y=selected_yvar)) +
                geom_point(shape=1, col="blue") +
                geom_smooth(method=lm) + ggtitle("Scatterplot") + xlab(selected_xvar) + ylab(selected_yvar) +
                theme(plot.title = element_text(size=18, hjust=0.5))

            # plot(unlist(df[selected_xvar]), unlist(df[selected_yvar]), main="Scatterplot", 
            #      xlab=selected_xvar, ylab=selected_yvar, pch=19)
        }
    })
}

Я также пытался использовать функцию base plot(), и до этого получал сообщение об ошибке Error: undefined columns selectedсюжет рендерит.

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете использовать функцию req (), чтобы остановить процесс и подождать, пока переменные не станут доступны.

    if (is.null(df)==FALSE) {
        req(selected_xvar, selected_yvar)
        ggplot(df, aes_string(x=selected_xvar, y=selected_yvar)) + # omitted below

См .: https://shiny.rstudio.com/reference/shiny/latest/req.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...