Rshinydashboard отображает сумму выбранного ввода в поле значений

Мой вопрос относится к «value4», который является значением в приведенном ниже коде.

Я создал вход для выбора, который позволяет пользователю выбрать имя на основе этого имени. Я хочу, чтобы приложение нашло количество проектов, связанных с выбранным именем (количество проектов = "X..setup"), а затем отображать общее количество проектов в поле значений ("value4").

Проблема, с которой я сталкиваюсь, заключается в получении суммы всех проектов. Пожалуйста, найдите мой код ниже:

    setups <- read.csv("C:/Users/obria/Desktop/setUps/setUp.csv",stringsAsFactors = F, header = TRUE)
View(setups)
head(setups)
searchDF <- setups[c(1,2,3,4,7,8,9,10,11)]
#lst.Owners <- as.list(unique(setups$Owners))
lst.Owners = as.character(setups$Owners)
Owners <- unique(lst.Owners)

userInput <- sum(str_count(setups$Over.all.Status.of.Project,"WIP")) %>% groub_by(Owners)

install.packages("dplyr")
install.packages("ggplot2")
library(ggplot2)
library(dplyr)
library(shiny)
library(shinydashboard)
library(stringr)
library (DT)

ui = dashboardPage(
  #Header
  dashboardHeader(title = "Set ups dashboard"),

  #Sidebar
  dashboardSidebar(
    sidebarMenu(
      menuItem("Dashboard", tabName = "dashboard"),
      menuItem("Search", tabName = "search"),
      menuItem("Break Down", tabName = "breakDown")
    )
  ),

  #Body
  dashboardBody(tabItems(
    # First tab content
    tabItem(tabName = "dashboard",
            fluidRow(
              valueBoxOutput("value1")
              ,valueBoxOutput("value2")
              ,valueBoxOutput("value3"),

              fluidRow(
                box(
                  title= "Owner Vs Set Ups"
                  ,status = "primary"
                  ,solidheader = TRUE
                  ,collapsible = TRUE
                  ,plotOutput("nameStatus", height = "300px")
                )
                ,box(
                  title= " Pant Vs Set Ups"
                  ,status = "primary"
                  ,solidheader = TRUE
                  ,collapsible = TRUE
                  ,plotOutput("plantSetUps", height = "300px"))))
    ),
    # Second tab content #
    tabItem(tabName = "search",
            fluidRow(
              h2("Search Set ups"),
              DT::dataTableOutput("mytable")
            )),

    # Third tab content #
    tabItem(tabName = "breakDown",
              h2("Search Set ups"),
            fluidRow(
              box(
              selectInput("selectVariable", "Select Variable:",
                          choices = Owners, 
                          selected = 1))),
            fluidRow(
              valueBoxOutput("value4")
            ))))
)
server = function(input, output) {

  # Get some data #

  # Total Set ups #
  totalSetUps <- sum(setups$X..setups)

  # Number of WIPs #
  workIP1 <- sum(str_count(setups$Over.all.Status.of.Project,"WIP"))
  workIP2 <- sum(str_count(setups$Over.all.Status.of.Project,"wip"))
  workInProgress <- (workIP1 + workIP2)

  # Number of Outstanding #
  outstanding <- sum(str_count(setups$Over.all.Status.of.Project,"Outstanding"))

  # Colonia - Test Val;ue box #
  #colonia <- sum(str_count(setups$Plant,"Colonia"))

  setUpByName <- reactive ({
    setups %>%
      filter(Owners == input$selectVariable) %>%
      sum(.$X..setups)
  })
  # Create the valueBoxOutput Content #
  output$value1 <- renderValueBox({
    valueBox(
      format(totalSetUps, format="d", big.mark=",")
      ,"Total Number of Set Ups"
      ,icon = icon("stats",lib="glyphicon")
      ,color = "purple")
  })
  output$value2 <- renderValueBox({
    valueBox(
      format(workInProgress, format="d", big.mark=",")
      ,"No. of project that are WIP"
      ,icon = icon("gbp",lib="glyphicon")
      ,color = "green")
  })
  output$value3 <- renderValueBox({
    valueBox(
      format(outstanding, format="d", big.mark=",")
      ,"No. of project that are Outstanding"
      ,icon = icon("menu-hamburger",lib="glyphicon")
      ,color = "yellow")
  })
  output$value4 <- renderValueBox({
    valueBox(
      format(setUpByName(), format="d", big.mark=",")
      ,"total # Set ups"
      ,icon = icon("menu-hamburger",lib="glyphicon")
      ,color = "yellow")
  })

  # Creating plot output content #
  output$nameStatus <- renderPlot({
    ggplot(data = setups, 
           aes(x=setups$Owners, y=setups$X..setup, fill=factor(Over.all.Status.of.Project))) + 
      geom_bar(position = "dodge", stat = "identity") + ylab("No. of Set ups") + 
      xlab("Owners") + theme(legend.position="bottom" 
                             ,plot.title = element_text(size=15, face="bold")) + 
      ggtitle("Owners vs No. of Set Ups") + labs(fill = "Status")
  })
  output$plantSetUps <- renderPlot({
    ggplot(data=setups, aes(x=setups$Plant, y= setups$X..setup)) +
      geom_bar(stat="identity", col="blue", fill="blue") +
      labs(title ="No of Set ups by plant")
  })
  output$mytable = DT::renderDataTable({
    setups
  })

  output$result <- renderText({
    paste("You chose", input$selectVariable)
  })

}


shinyApp(ui, server)

str(setups)

столбцы DF Ошибка

CodeError2 ShinyError2

Данные Типы данных

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


person sqlworrier    schedule 07.03.2019    source источник
comment
Добро пожаловать в StackOverflow! Пожалуйста, прочитайте информацию о как задать хороший вопрос и как привести воспроизводимый пример. Это значительно облегчит другим людям помощь.   -  person thothal    schedule 07.03.2019
comment
трудно сказать, не видя ваших объектов данных, но select(X..setups) в setUpByName выглядит странно до group_by()   -  person RolandASc    schedule 07.03.2019
comment
@RolandASc Я поставил select(X..setups) после group_by() и, к сожалению, это все еще не сработало/,   -  person sqlworrier    schedule 07.03.2019
comment
@RolandASc Я также загрузил 2 изображения, одно - заголовки DF, а другое - ошибка поля значений, доступ к этим изображениям можно получить по ссылке, расположенной прямо под кодом выше DF Columns & Error   -  person sqlworrier    schedule 07.03.2019


Ответы (1)


вызов select работает как оператор select в SQL, а это означает, что после этого оператора X..setups остается единственным столбцом. Если вы хотите включить настройки только для человека, выбранного в input$selectVariable, вы должны сначала отфильтровать фрейм данных setups. Во-вторых, функции в dplyr возвращают объекты того же класса, что и входной объект. Вы передаете tibble в функцию, поэтому она возвращает tibble. Однако вам нужно, чтобы он был скаляром, чтобы его можно было отобразить в файле valueBox. Вы можете сделать его скалярным, передав отфильтрованные данные в базовую функцию sum и просуммировав только столбец X..setups.

setUpByName <- reactive ({
  setups_filtered <- setups %>%
    filter(Owners == input$selectVariable)
  sum(setups_filtered$X..setups)
})
person Wil    schedule 07.03.2019
comment
Спасибо за ваш ответ, я добавил приведенный выше код, ошибка tibble теперь исчезла (спасибо, что указали на эту проблему), но теперь у меня есть другая ошибка: определено только в фрейме данных со всеми числовыми переменными. Вы знаете, как я могу это исправить? Это моя первая блестящая приборная панель, поэтому спасибо за помощь. - person sqlworrier; 07.03.2019
comment
Вы можете опубликовать полный текст сообщения об ошибке или изображение? Если проблема в вашем исходном вопросе решена, вы должны принять этот ответ и задать новый вопрос с новым сообщением об ошибке, если он не связан с вашим исходным вопросом о valueBox. - person Wil; 08.03.2019
comment
Новая ошибка связана с рассматриваемым полем значений, я прикрепил ошибку в блестящем коде и ошибку в приведенном выше коде (в виде ссылок ErrorCode2 и ShinyError2 - person sqlworrier; 08.03.2019
comment
без ваших данных трудно понять, откуда берется ошибка, но похоже, что один из фрагментов данных, которые вы суммируете, не является числовым. Я бы запустил str(setups) вне вашего сеанса Shiny, чтобы увидеть, как отформатированы столбцы (или, если это tbl, просто вызовите print() для данных, и типы столбцов будут отображаться). - person Wil; 08.03.2019
comment
Я загрузил ссылку выше с образцами данных (ссылка называется данными). Столбец настроек содержит все числа, а владельцы содержат имена (нет отсутствующих данных ни в одном из столбцов). - person sqlworrier; 08.03.2019
comment
можете ли вы обновить код, чтобы включить изменения, которые вы сделали до сих пор? Ошибка указывает на то, что вы суммируете весь фрейм данных (а не столбец, как в моем коде). Та же ошибка возникает, если вы запускаете sum(iris), но если вы суммируете фрейм данных, который полностью числовой (sum(mtcars)), ошибка не возвращается. Где-то вы суммируете полный фрейм данных с нечисловыми столбцами. Также обратите внимание, что просто потому, что в этой ячейке вашей электронной таблицы есть число, не означает, что R будет читать столбец как числовой, поэтому важно запускать str или print. - person Wil; 08.03.2019
comment
Я добавил обновленный код, а также добавил скриншот типов данных (есть ссылка под названием «Типы данных»), вся помощь приветствуется. - person sqlworrier; 08.03.2019
comment
см. мое обновление. Я добавил код, используя набор данных mtcars, показывающий, что мой пример должен давать функционирующее поле значений. Я считаю, что ошибка, вероятно, исходит из другого места. Попробуйте закомментировать output$value4 <- renderValueBox(...) и посмотрите, появляется ли ошибка по-прежнему. - person Wil; 08.03.2019
comment
Я закомментировал output$value4 ‹- renderValueBox(...) и не получил никакой ошибки, поэтому ошибка связана с Value4. Мне интересно, потому что Owners - это строковый столбец, поэтому я получаю сообщение об ошибке? - person sqlworrier; 10.03.2019
comment
нет, я думаю, проблема была в том, что я использовал sum после трубы. Я внес небольшое изменение в реактивную функцию в своем ответе и отделил фильтрацию от суммирования. Дай мне знать, если это работает. Я воспроизвел его в наборе данных iris, потому что он имеет нечисловые столбцы, в отличие от набора данных mtcars, который я использовал для тестирования в прошлый раз. - person Wil; 11.03.2019
comment
Итак, кажется, что вы почти это сделали, поле значения теперь отображается по крайней мере, единственная проблема в том, что оно показывает значение 0 для всего. - person sqlworrier; 11.03.2019
comment
это означает, что filter(Owners == input$selectVariable) не возвращает TRUE ни для одного из значений, выбранных для selectVariable. Что побудило вас запустить as.character на setups$Owners? он не читал из CSV как столбец символов? - person Wil; 11.03.2019
comment
вы легенда ЭТО РАБОТАЕТ!!, эта проблема съедала меня последние несколько недель, я очень ценю ваше время - person sqlworrier; 11.03.2019
comment
никаких проблем, извините, потребовалось несколько попыток! Если ответ приемлем, обязательно примите его: stackoverflow.com/help/someone-answers - person Wil; 11.03.2019