2016-01-05 2 views
1

Я пытался создавать собственные графики в моем Блестящая проекта, но есть ошибка происходя:Создание пользовательских графиков с импортными данных

> 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, , затем вы нажимаете кнопку «Создать», и это делает трюк, но каким-то образом это не делает. И я должен также подчеркнуть, что я попытался применить функцию na.omit перед данными вроде: na.omit(input$graph_X) все еще это не делает трюк.

Спасибо в любом случае за вашу помощь!

ответ

0

Если я правильно понимаю вас, пользователь должен выбрать имя столбца в импортированных данных. Проблема здесь в том, что входные аргументы от пользователей имеют характерный класс. Когда вы вызываете функцию plot, имя нужного столбца в данных помещается внутри вызова функции как вектор символов длины 1. Он не знает, как обрабатывать такие аргументы. То же самое верно для lm-функции. Чтобы решить эту проблему, вы можете, например, подмножить данные, используя data[,'someCharacter'].

В следующий раз, когда вы опубликуете вопрос, было бы полезно включить воспроизводимый пример, см. here. Я создал воспроизводимое фиктивное приложение Shiny для демонстрации ответа. Чтобы успешно запустить это приложение, вам необходимо сохранить этот файл с именем «app.R» и убедиться, что рабочий каталог содержит файл.

Если вы хотите, чтобы ваш plotOutput зависел от какого-либо события от пользователя, то есть вы хотите, чтобы код запускался, когда пользователь, например. нажимает кнопку, я рекомендую использовать eventReactive вместо функции наблюдения.

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) 

Надеюсь, это поможет!

Смежные вопросы