Как исправить «объект« mydata 'not found »в блестящем приложении при построении гистограммы - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь создать приложение Shiny, которое позволяет пользователям

  1. создать набор данных путем ввода значений частоты для различных значений

  2. сюжетгистограмма этого набора данных

Парный пример кода выглядит следующим образом:

library(shiny)
library(ggplot2)

# Define UI for application
ui <- fluidPage(


    # Sidebar with inputs
    sidebarLayout(
        sidebarPanel(
            numericInput("data1s",
                         "How many have a score of 1?",
                         value = 0,
                         min = 0
            ),
            numericInput("data2s",
                         "How many have a score of 2?",
                         value = 0,
                         min = 0
            ),
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 3,
                        value = 1)
        ),

        # Show a plot of the data
        mainPanel(
            htmlOutput("mydatatable"),
            plotOutput("distPlot")
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
    #show the data
    output$mydatatable <- renderTable({
        #create the dataframe from the frequncies
        mydata <- data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s))
        )
    }
    )
    #show the histogram
    output$distPlot <- renderPlot({
        ggplot(mydata, aes(x=our_data)) +
            geom_histogram(bins = input$bins)

    })
}

# Run the application 
shinyApp(ui = ui, server = server)

Я добился создания набора данных, но код дляотображение гистограммы данных возвращает ошибку: «объект« mydata »not found» вместо отображения гистограммы. Гистограмма должна обновляться всякий раз, когда изменяется любой из входных данных.

Любая помощь в разрешении будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 ноября 2019

mydata, который вы определяете в реактиве mydatatable, больше нигде не виден. Чтобы понять почему, я предлагаю вам прочитать о пространствах имен и средах R;один хороший урок по этому вопросу - Advanced R - Environments * Hadley .

Чтобы исправить это, я предлагаю вам сделать сами данные реактивным блоком и зависеть от него в двух других ваших блоках (таблица и график):

server <- function(input, output) {
    mydata <- reactive({
      req(input$data1s, input$data2s)
      data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s)))
    })

    #show the data
    output$mydatatable <- renderTable({ req(mydata()); })

    #show the histogram
    output$distPlot <- renderPlot({
      req(mydata())
      ggplot(mydata(), aes(x=our_data)) +
          geom_histogram(bins = input$bins)
    })
}

(не проверено.)

Я добавил использование req исключительно для предотвращения дрожания при запуске и предупреждений / ошибок в приложении. Когда блестящее приложение прогревается, обычно входные переменные пусты (NULL), и все, что от него зависит, будет временно вызывать ошибки до тех пор, пока входные данные не стабилизируются. (Для примера того, почему что-то спотыкается, input$data1s может сначала показать значение NULL и попытаться посмотреть, сработает ли data.frame(our_data=rep(1,NULL)).)

req просто ищет что-то, что "истина ", что означает: не NULL, не NA, не FALSE, длина больше 0 и т. д. Подробнее см. ?shiny::req.

Хотя req строго не требуется,у него есть свои преимущества. Как вы можете сделать из кода таблицы, req(x) вернет "первое значение, которое было передано в" (из ?req), поэтому для краткости его можно использовать в этом режиме быстрого доступа.

И еще одна мыльница: в моем ограниченном опыте с shiny реактивностью я несколько раз генерировал данные в реактивном блоке и использовал их исключительно в этом реактивном блоке. Учитывая, что всякий раз, когда вы создаете data.frame (или list или ... какую-то важную структуру, зависящую от пользовательского ввода), часто выгодно делать ее собственным реактивным компонентом (в частности, не компонентом output). ), а затем зависите от него столько раз, сколько необходимо.

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