我一直试图在我的Shiny Project中创建自定义图形,但是发生了错误:
> Warning in model.response(mf, "numeric") : NAs introduced by coercion
> Error in contrasts<-(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
> contrasts can be applied only to factors with 2 or more levels
以下是代码:
observeEvent(input$create_cutom_graph, {
output$cutom_graph <- reactive(renderPlot(
plot(input$graph_X,input$graph_Y),
abline(lm(input$graph_X~input$graph_Y)),
title(input$graph_X,"i",input$graph_Y)
))
}
))
它应该工作的方式是你从下拉菜单中选择哪些数据应该在X轴上然后你用Y轴做同样的事情,
然后你点击按钮&#34;创建&#34;它确实有诀窍但不知何故它没有。
我还要强调,我已尝试在数据之前应用函数na.omit
,例如:na.omit(input$graph_X)
仍然无法解决问题。
非常感谢你的帮助!
答案 0 :(得分:0)
如果我理解正确,用户应该在导入的数据中选择列的名称。这里的问题是来自用户的输入参数是一个字符类。当您调用plot函数时,数据中所需列的名称将作为长度为1的字符向量放在函数调用中。它不知道如何处理这些参数。同样适用于lm功能。要解决此问题,您可以使用data[,'someCharacter']
对数据进行子集化。
下次发布问题时,包含可重现的示例会很有帮助,请参阅reserved keyword。我创建了一个可重现的虚拟Shiny App来演示答案。要成功运行此应用程序,您需要使用名称“app.R”保存此文件,并确保工作目录包含该文件。
如果您希望plotOutput依赖于用户的某些事件,那么您希望代码在用户运行时运行,例如点击一个按钮,我建议使用eventReactive而不是observeEvent。
ui <- shinyUI(fluidPage(
titlePanel("Plot columns in a dataset"),
fluidRow(
column(4,
selectInput("graph_X", "Select column 1", choices=c("One","Two","Three")),
selectInput("graph_Y", "Select column 2", choices=c("One","Two","Three"),selected="Two"),
actionButton("create_custom_graph","Plot")
),
column(8,
plotOutput("plot")
)
)
))
server <- function(input,output){
makePlot<- eventReactive(input$create_custom_graph,{
#make some dummy data
data=data.frame(One=c(1,2,3,4,5),Two=c(1,2,3,4,5),Three=c(4,5,6,7,8))
col1=data[,input$graph_X]
col2=data[,input$graph_Y]
#evaluate the characters
plot(col1,col2)
abline(lm(col1~col2))
title(paste(input$graph_X,"i",input$graph_Y))
})
output$plot <- renderPlot({
makePlot()
})
}
shinyApp(ui,server)
希望这有帮助!