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