使用导入的数据创建自定义图表

时间:2016-01-05 13:42:43

标签: r shiny

我一直试图在我的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)仍然无法解决问题。

非常感谢你的帮助!

1 个答案:

答案 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)

希望这有帮助!