R Ggplot2在应用程序中显示错误消息

R Ggplot2在应用程序中显示错误消息,r,ggplot2,shiny,R,Ggplot2,Shiny,请注意,我正在尝试将我闪亮应用程序中的图形转换为ggplot2图形。我使用反应函数生成财务比率的值,这些值以条形图和饼图的形式绘制,例如利润/营业额。加载应用程序时,默认情况下,每个输入字段(利润输入字段和营业额输入字段)都包含值,其比率绘制在图表中。加载应用程序时将显示ggplot2图形。但是,当我清除一个输入字段(例如在profit中)以便输入一个新值时,我在控制台中收到以下错误消息: Warning in profit/turnover : longer object length

请注意,我正在尝试将我闪亮应用程序中的图形转换为ggplot2图形。我使用反应函数生成财务比率的值,这些值以条形图和饼图的形式绘制,例如利润/营业额。加载应用程序时,默认情况下,每个输入字段(利润输入字段和营业额输入字段)都包含值,其比率绘制在图表中。加载应用程序时将显示ggplot2图形。但是,当我清除一个输入字段(例如在profit中)以便输入一个新值时,我在控制台中收到以下错误消息:

Warning in profit/turnover :

  longer object length is not a multiple of shorter object length

Warning: Error in data.frame: arguments imply differing number of rows: 5, 4

  131: stop

  130: data.frame

  129: <reactive:profitability.df> [C:\Users\Idiaye\Documents\R data\mavisanalytic/app.R#446]

  113: profitability.df

   99: renderPlotly [C:\Users\Idiaye\Documents\R data\mavisanalytic/app.R#451]

   98: func

   95: func

   82: origRenderFunc

   81: output$bar

    1: shiny::runApp
利润/营业额中的警告:
较长的对象长度不是较短对象长度的倍数
警告:data.frame中出错:参数表示行数不同:5、4
131:停
130:data.frame
129:[C:\Users\Idiaye\Documents\R data\mavisanalysis/app.R#446]
113:盈利能力.df
99:renderPlotly[C:\Users\Idiaye\Documents\R data\mavisanalysis/app.R#451]
98:func
95:func
82:origRenderFunc
81:输出$bar
1:Shining::runApp
该应用程序旨在计算和绘制五年内的财务比率;因此,有五个数据输入字段,分别用于利润和营业额。然而,我希望用户能够分析他们选择的任何年份的财务表现。但是,当输入字段被清除时,我会收到上面的错误消息。在将绘图转换为ggplot2之前,我没有遇到此问题。以下是我的可复制代码:

library(shiny)
library(ggplot2)
library(plotly)

ui<-navbarPage(
    windowTitle="Reprex",fluid=TRUE, title=strong("Reprex"),
    tabPanel(title="Reprex App",
        sidebarLayout(
            sidebarPanel(width=2,
                actionButton("delete",strong("Clear Fields"),icon=icon("broom")),br(),br(),  
                textInput("pro","Profit 1",value="100000",width=150),
                textInput("prof","Profit 2",value="150000",width=150),
                textInput("profs","Profit 3",value="200000",width=150),
                textInput("profit","Profit 4",value="250000",width=150),
                textInput("profits","Profit 5",value="300000",width=150),
                hr(),
                h4(strong("Turnover figures:")),
                actionButton("remove",strong("Clear Fields"),icon=icon("broom")),br(),br(),
                textInput("turn","Turnover 1",value="350000",width=150),
                textInput("turno","Turnover 2",value="300000",width=150),
                textInput("turnov","Turnover 3",value="420000",width=150),
                textInput("turnover","Turnover 4",value="600000",width=150),
                textInput("turnovers","Turnover 5",value="550000",width=150),
                actionButton("go",strong("Calculate Ratio"),icon=icon("caret-right"))
                
            ),mainPanel(
                plotlyOutput("plot")
            )
        )
    )
)

server<-function(input,output,session){
    
    observeEvent(input$delete,{
        
        updateTextInput(session,"pro",value="",placeholder="0")
        updateTextInput(session,"prof",value="",placeholder="0")
        updateTextInput(session,"profs",value="",placeholder="0")
        updateTextInput(session,"profit",value="",placeholder="0")
        updateTextInput(session,"profits",value="",placeholder="0")
    })
    
    
    observeEvent(input$remove,{
        
        updateTextInput(session,"turn",value="",placeholder="0")
        updateTextInput(session,"turno",value="",placeholder="0")
        updateTextInput(session,"turnov",value="",placeholder="0")
        updateTextInput(session,"turnover",value="",placeholder="0")
        updateTextInput(session,"turnovers",value="",placeholder="0")
    })
    
    profits<-reactive({
        as.numeric(c(
            if(input$pro>0){input$pro},
            if(input$prof>0){input$prof},
            if(input$profs>0){input$profs},
            if(input$profit>0){input$profit},
            if(input$profits>0){input$profits}
        ))
    })
    
    turnover<-reactive({
        as.numeric(c(
            if(input$turn>0){input$turn},
            if(input$turno>0){input$turno},
            if(input$turnov>0){input$turnov},
            if(input$turnover>0){input$turnover},
            if(input$turnovers>0){input$turnovers}
        ))
    })
    
    year<-reactive({
        c(
            if(input$pro>0){"Year 1"},
            if(input$prof>0){"Year 2"},
            if(input$profs>0){"Year 3"},
            if(input$profit>0){"Year 4"},
            if(input$profits>0){"Year 5"}
        )
    })
    profit.ratio<-function(profits,turnover){
        profitability<-round(profits/turnover*100,1)
        return(profitability)
    }
  profitability<-reactive({profit.ratio(profits(),turnover())}) 
  
  
  
  profit.df<-reactive({data.frame(profitability(),year())})
  
  output$plot<-renderPlotly({
      input$go
      isolate(profit.df()%>%
          ggplot()+aes(x=year(),y=profitability(),fill=year())+geom_bar(stat="identity")+
          labs(x="Years",y="Profitability ratios (%)",fill="Years")+scale_fill_brewer(palette="Set1")+
              geom_text(label=profitability(),position=position_stack(vjust=0.8)))
  })
}
shinyApp(ui=ui,server=server)
库(闪亮)
图书馆(GG2)
图书馆(绘本)
ui0){input$profs},
如果(input$profit>0){input$profit},
如果(输入$PROPERTIES>0){input$PROPERTIES}
))
})
转换0){input$turn},
如果(input$turno>0){input$turno},
如果(input$turnov>0){input$turnov},
如果(输入$oversince>0){input$oversince},
如果(输入$turnsovers>0){input$turnsovers}
))
})
第0年{“第1年”},
如果(输入$prof>0){“第2年”},
如果(输入$profs>0){“第3年”},
如果(输入$profit>0){“第4年”},
如果(输入$profits>0){“第5年”}
)
})

利润率您可以使用
req
确保所有
输入满足进一步处理所需的条件。
这将避免控制台中出现警告消息

尝试:


当您清算利润或营业额时,您没有处理丢失的值。我创建了一个新的反应式数据框,在这里可以更容易地检查利润或营业额是否缺少所有字段。试试这个代码

ui<-navbarPage(
  windowTitle="Reprex",fluid=TRUE, title=strong("Reprex"),
  tabPanel(title="Reprex App",
           sidebarLayout(
             sidebarPanel(width=2,
                          actionButton("delete",strong("Clear Fields"),icon=icon("broom")),br(),br(),  
                          textInput("pro","Profit 1",value="100000",width=150),
                          textInput("prof","Profit 2",value="150000",width=150),
                          textInput("profs","Profit 3",value="200000",width=150),
                          textInput("profit","Profit 4",value="250000",width=150),
                          textInput("profits","Profit 5",value="300000",width=150),
                          hr(),
                          h4(strong("Turnover figures:")),
                          actionButton("remove",strong("Clear Fields"),icon=icon("broom")),br(),br(),
                          textInput("turn","Turnover 1",value="350000",width=150),
                          textInput("turno","Turnover 2",value="300000",width=150),
                          textInput("turnov","Turnover 3",value="420000",width=150),
                          textInput("turnover","Turnover 4",value="600000",width=150),
                          textInput("turnovers","Turnover 5",value="550000",width=150),
                          actionButton("go",strong("Calculate Ratio"),icon=icon("caret-right"))
                          
             ),mainPanel(
               plotlyOutput("plot")
             )
           )
  )
)

server<-function(input,output,session){
  
  DF1 <- reactiveValues(data=NULL)
  
  observeEvent(input$delete,{
    
    updateTextInput(session,"pro",value="",placeholder="0")
    updateTextInput(session,"prof",value="",placeholder="0")
    updateTextInput(session,"profs",value="",placeholder="0")
    updateTextInput(session,"profit",value="",placeholder="0")
    updateTextInput(session,"profits",value="",placeholder="0")
  })
  
  observeEvent(input$remove,{
    
    updateTextInput(session,"turn",value="",placeholder="0")
    updateTextInput(session,"turno",value="",placeholder="0")
    updateTextInput(session,"turnov",value="",placeholder="0")
    updateTextInput(session,"turnover",value="",placeholder="0")
    updateTextInput(session,"turnovers",value="",placeholder="0")
  })

  
  findata <- reactive({
    years <- c("Year 1", "Year 2", "Year 3", "Year 4", "Year 5")
    profits <- c(input$pro, input$prof, input$profs, input$profit, input$profits)
    turnovers <- c(input$turn,input$turno,input$turnov,input$turnover,input$turnovers)
    fdata <- data.frame(profitability=c(),year=c())
    chkp <- sum(is.na(as.numeric(profits)))
    chkt <- sum(is.na(as.numeric(turnovers)))
    if (chkp==5 | chkt==5) {
      fdata <- NULL
    }else{
      lapply(1:5, function(i){
        if (!is.null(profits[i]) & !is.null(turnovers[i]) ) {
          if (profits[i]>0 & turnovers[i]>0) {
            pfy <- round(as.numeric(profits[i])/as.numeric(turnovers[i])*100,1)
            fdata <<- rbind(fdata,data.frame(profitability=pfy,year=years[i]))
          }
          
        }
        
      })
    }
    
    fdata
  })
  
  observe({DF1$data <- findata()})
  
  #observeEvent(input$go, {
    output$plot<-renderPlotly({
      input$go
     
      df <- DF1$data
      
      chkpfy <- sum(is.na(as.numeric(df$profitability)))
      if (is.null(df)) return(NULL)
      if (chkpfy==5) { 
        return(NULL)
      }else{
        p <-  ggplot(data=df, aes(x=year, y=profitability, fill=year )) +
          geom_bar(stat="identity") +
          labs(x="Years",y="Profitability ratios (%)",fill="Years") +
          scale_fill_brewer(palette="Set1") +
          geom_text(label=df$profitability, position=position_stack(vjust=0.8))
                        
        ggplotly(p)
      }
      
    })
  #})

}
shinyApp(ui=ui,server=server)

ui谢谢,但我试图实现的是,用户能够清除他们想要的任何字段,并输入自己的数据进行分析,默认图形仍保留在主面板中,直到用户点击“计算比率”按钮生成新图形。您关于req()的建议确实消除了错误消息,但除非所有五个输入字段都已填充,否则它不会运行新的分析。你有什么建议吗?我会使用
eventReactive(输入$go,…)
来渲染绘图。但是我现在没有时间进一步研究这个问题。嗨,谢谢,但是上面的代码无法运行。是否有其他方法使ggplot2获取输入值?Validat()消除了错误消息,但除非所有五个输入字段都已填充,否则它不会运行新的分析。您可能缺少一些库。被动数据框findata仅使用既有利润又有营业额的行创建。您确定无法获得上述输出吗?
  profits<-reactive({
    validate(need(input$pro>0 &
                  input$prof>0 &
                  input$profs>0 &
                  input$profit>0 &
                  input$profits>0,'Please fill all coefs'))
    
    as.numeric(c(input$pro,
                 input$prof,
                 input$profs,
                 input$profit,
                 input$profits
    ))
  })
ui<-navbarPage(
  windowTitle="Reprex",fluid=TRUE, title=strong("Reprex"),
  tabPanel(title="Reprex App",
           sidebarLayout(
             sidebarPanel(width=2,
                          actionButton("delete",strong("Clear Fields"),icon=icon("broom")),br(),br(),  
                          textInput("pro","Profit 1",value="100000",width=150),
                          textInput("prof","Profit 2",value="150000",width=150),
                          textInput("profs","Profit 3",value="200000",width=150),
                          textInput("profit","Profit 4",value="250000",width=150),
                          textInput("profits","Profit 5",value="300000",width=150),
                          hr(),
                          h4(strong("Turnover figures:")),
                          actionButton("remove",strong("Clear Fields"),icon=icon("broom")),br(),br(),
                          textInput("turn","Turnover 1",value="350000",width=150),
                          textInput("turno","Turnover 2",value="300000",width=150),
                          textInput("turnov","Turnover 3",value="420000",width=150),
                          textInput("turnover","Turnover 4",value="600000",width=150),
                          textInput("turnovers","Turnover 5",value="550000",width=150),
                          actionButton("go",strong("Calculate Ratio"),icon=icon("caret-right"))
                          
             ),mainPanel(
               plotlyOutput("plot")
             )
           )
  )
)

server<-function(input,output,session){
  
  DF1 <- reactiveValues(data=NULL)
  
  observeEvent(input$delete,{
    
    updateTextInput(session,"pro",value="",placeholder="0")
    updateTextInput(session,"prof",value="",placeholder="0")
    updateTextInput(session,"profs",value="",placeholder="0")
    updateTextInput(session,"profit",value="",placeholder="0")
    updateTextInput(session,"profits",value="",placeholder="0")
  })
  
  observeEvent(input$remove,{
    
    updateTextInput(session,"turn",value="",placeholder="0")
    updateTextInput(session,"turno",value="",placeholder="0")
    updateTextInput(session,"turnov",value="",placeholder="0")
    updateTextInput(session,"turnover",value="",placeholder="0")
    updateTextInput(session,"turnovers",value="",placeholder="0")
  })

  
  findata <- reactive({
    years <- c("Year 1", "Year 2", "Year 3", "Year 4", "Year 5")
    profits <- c(input$pro, input$prof, input$profs, input$profit, input$profits)
    turnovers <- c(input$turn,input$turno,input$turnov,input$turnover,input$turnovers)
    fdata <- data.frame(profitability=c(),year=c())
    chkp <- sum(is.na(as.numeric(profits)))
    chkt <- sum(is.na(as.numeric(turnovers)))
    if (chkp==5 | chkt==5) {
      fdata <- NULL
    }else{
      lapply(1:5, function(i){
        if (!is.null(profits[i]) & !is.null(turnovers[i]) ) {
          if (profits[i]>0 & turnovers[i]>0) {
            pfy <- round(as.numeric(profits[i])/as.numeric(turnovers[i])*100,1)
            fdata <<- rbind(fdata,data.frame(profitability=pfy,year=years[i]))
          }
          
        }
        
      })
    }
    
    fdata
  })
  
  observe({DF1$data <- findata()})
  
  #observeEvent(input$go, {
    output$plot<-renderPlotly({
      input$go
     
      df <- DF1$data
      
      chkpfy <- sum(is.na(as.numeric(df$profitability)))
      if (is.null(df)) return(NULL)
      if (chkpfy==5) { 
        return(NULL)
      }else{
        p <-  ggplot(data=df, aes(x=year, y=profitability, fill=year )) +
          geom_bar(stat="identity") +
          labs(x="Years",y="Profitability ratios (%)",fill="Years") +
          scale_fill_brewer(palette="Set1") +
          geom_text(label=df$profitability, position=position_stack(vjust=0.8))
                        
        ggplotly(p)
      }
      
    })
  #})

}
shinyApp(ui=ui,server=server)