в блестящем, как построить из слайдера, который содержит добавление столбцов на основе выбора входа - PullRequest
3 голосов
/ 27 сентября 2019

Я новичок в R и пытаюсь создать приложение Shiny.Приложение содержит sliderInput для определения суммы инвестиций.selectInput для определения типа транспортного средства для инвестирования (car или motorcycle) и еще один selectInput для выбора марки name.

Мои запросы:

  1. После выбора типа транспортного средства (car или motorcycle) автоматически выбираются строки, содержащие выбранный тип транспортного средства (например, «автомобили»)
  2. После этого суммируйте значения в profitстолбец и разделить каждый на общую сумму, чтобы рассчитать вклад каждого бренда в общую прибыль.
  3. Добавить новый столбец, который содержит процент от каждого бренда name
  4. Затем добавить новый столбец, который умножается наsliderInput значение этого процента для расчета ожидаемой прибыли, если мы инвестировали сумму в sliderInput.
  5. Затем создайте гистограмму для каждого бренда name с их прибылью

    Вот код:

    library(shiny)
    library(dplyr)
    library(plotly)
    
    df1<-
    data.frame (
    Vehicle_type=c("CAR","CAR","CAR","MOTORCYCLE","MOTORCYCLE","MOTORCYCLE"),Brand_Name=c("ford","Honda","Audi","SYM","Honda","Harley"),revenues=(as.integer(c("526","552","445","222","223","300"))),cost=(as.integer(c("426","427","325","172","178","235"))),profit=(as.integer(c("100","125","120","50","45","65"))),branch1=(as.integer(c("10","15","12","6","5","5"))),branch2=(as.integer(c("3","4","7","6","4","9"))))
    shinyUI(fluidPage(titlePanel("Vehicles"),
    sidebarLayout(sidebarPanel(sliderInput("bins", "investment:", min = 1000,max = 10000,value = 5000),
    selectInput("ProductId","Vehicle type:",choices=unique(df1$Vehicle_type)),
    selectInput("nameId","Vehicle Brand Name:",choices=NULL),
    selectInput("IndicatorId","Select Indicator:",choices=c("profit","cost","revenues",selected="revenues"))),
    mainPanel(plotlyOutput("Test2", height = "250px")))))
    

сервер

library(shiny)
library(dplyr)
library(plotly)

shinyServer(function(session,input, output) {

observe({
print(input$ProductId)
df2<-df1%>%filter(Vehicle_type==input$ProductId) %>% select(Brand_Name)
updateSelectInput(session,"nameId","Vehicle Brand Name:",choices=unique(df2))
IndicatorSum<- reactive({df2 %>% pull(input$IndicatorId) %>% sum()})
df3<-mutate(df2,perctcontcl=input$IndicatorId/IndicatorSum)
df4<-mutate(df3,perctcontout=perctcontcl*input$bins)
output$Test2 <- renderPlotly({
  Test2 <- plot_ly(
  df4, x = ~Brand_Name, y = ~get(input$IndicatorId), type = "bar",color=~Brand_Name)})
  })
 })

    shinyServer(function(input, output) {})

1 Ответ

0 голосов
/ 28 сентября 2019

Вот рабочий пример, основанный на вашей идее, с несколькими исправлениями и небольшой помощью от dplyr NSE

#Add stringsAsFactors = FALSE to data.frame to solve ghost factor issue downstream in plotly
df1<-
  data.frame (
    Vehicle_type=c("CAR","CAR","CAR","MOTORCYCLE","MOTORCYCLE","MOTORCYCLE"),Brand_Name=c("ford","Honda","Audi","SYM","Honda","Harley"),revenues=(as.integer(c("526","552","445","222","223","300"))),cost=(as.integer(c("426","427","325","172","178","235"))),profit=(as.integer(c("100","125","120","50","45","65"))),branch1=(as.integer(c("10","15","12","6","5","5"))),branch2=(as.integer(c("3","4","7","6","4","9"))), stringsAsFactors = FALSE)


shinyServer(function(session,input, output) {
  observe({
    print(input$ProductId)
   #df2<-df1%>%filter(Vehicle_type==input$ProductId) %>% select(Brand_Name)
    df2<-df1%>%filter(Vehicle_type==input$ProductId)
   #updateSelectInput(session,"nameId","Vehicle Brand Name:",choices=unique(df2))
    updateSelectInput(session,"nameId","Vehicle Brand Name:",choices=unique(df2$Brand_Name))
    print(input$IndicatorId)
    print(df2)
   #IndicatorSum<- reactive({df2 %>% pull(input$IndicatorId) %>% sum()})
    IndicatorSum<- df2 %>% pull(input$IndicatorId) %>% sum()
    print(IndicatorSum)
    #browser()
    df3<-mutate(df2,!!quo_name(paste0(input$IndicatorId,'_perctcontcl')):=(!!sym(input$IndicatorId)/IndicatorSum)*input$bins)
    print(df3)
    #To check why we get ghost factor in plotly, we add stringsAsFactors = FALSE to data.frame to solve this issue
    print(str(df3))

    output$Test2 <- renderPlotly({
      Test2 <- plot_ly(
        df3, x = ~Brand_Name, 
        y = ~get(paste0(input$IndicatorId,'_perctcontcl')),
        #Here I think you need the updated Indicator after we multiply by input$bin  
        #y = ~get(input$IndicatorId), 
        type = "bar",color=~Brand_Name)})
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...