Блестящий — как предотвратить построение графика, если данные не выбраны с помощью ползунка

#r #shiny #plotly

#r #блестящий #построение

Вопрос:

Я хочу построить плотный 3D-график внутри моего приложения Shiny, но только данные со значениями, которые находятся в диапазоне ползунка диапазона ввода. Однако я хочу предотвратить построение графика, когда в диапазоне ползунков нет значений — в настоящее время это вызывает следующую ошибку при отсутствии входных данных:

 Warning: Error in UseMethod: no applicable method for 'plotly_build' applied       
to an object of class "NULL"
  

или в примере кода:

 Error in : length(Lab) == 3L is not TRUE
  

Это пример кода, который имеет ошибку, аналогичную исходной проблеме:

 library(shiny)
library(plotly)

d = diamonds[1:100,]

ui = fluidPage(
headerPanel("Data"),

sliderInput(inputId="slider", label = "Choose a range", value =c(0,max(d$price)),
          min = 0,max = max(d$price)),

# saves space for the plot in the user interface. Id allows communication
plotlyOutput(outputId="trendPlot", width="100%", height=800)

)

server = function(input, output)
{
NROF = reactiveValues(test = 1)

output$trendPlot= renderPlotly({
d_sub=d[d$price >= input$slider[1] amp; d$price <= input$slider[2],]
NROF = nrow(d) 
if(NROF != 0)
{
  plot_ly(d_sub, x=d_sub$cut, y=d_sub$color, z=factor(d_sub$color),
          type='scatter3d', mode='markers',
          sizemode='diameter', size=d_sub$price, color=d_sub$price,colors = 'Set1')

}
})
}

shinyApp(ui=ui, server=server)
  

РЕШЕНИЕ: я допустил ошибку, используя реактивные значения — это должно было быть NROF $TEST

Комментарии:

1. пожалуйста, отредактируйте и упростите свой вопрос, предоставив воспроизводимый пример. например, предоставив полностью исполняемый блестящий код (сервер и пользовательский интерфейс), включающий только вашу проблему.

2. Хорошо, ошибка / предупреждение исходит от параметра color функции plotly . Если взять d $ color, он отобразит его (хотя при фильтрации при наблюдении за цветом будет использоваться неправильный цвет), поэтому вопрос остается тем же.

Ответ №1:

Звучит как req() или validate() то, что вы ищете:

http://shiny.rstudio.com/articles/req.html

http://shiny.rstudio.com/articles/validation.html

 library(shiny)
library(plotly)

d <- diamonds[1:100,]

ui <- fluidPage(
  headerPanel("Data"),
  sliderInput(inputId="slider",
              label = "Choose a range",
              value =c(0,max(d$price)),
              min = 0,max = max(d$price)),
  # saves space for the plot in the user interface. Id allows communication
  plotlyOutput(outputId="trendPlot",
               width="100%", height=800)

)

server <- function(input, output) {
  output$trendPlot <- renderPlotly({
    d_sub <- d[d$price >= input$slider[1] amp; d$price <= input$slider[2],]
    req(nrow(d_sub) > 0)
    # validate(need(nrow(d_sub) > 0, "No data selected!"))

    plot_ly(d_sub, x=d_sub$cut, y=d_sub$color, 
            z=factor(d_sub$color), type='scatter3d', 
            mode='markers', sizemode='diameter', 
            size=d_sub$price, color=d_sub$price,
            colors = 'Set1')
  })
}

shinyApp(ui=ui, server=server)
  

Комментарии:

1. Ну, это неудобно, на самом деле вы оба дали мне очень хороший отзыв, поэтому не уверен, какой из них принять в качестве ответа 🙂 Большое вам спасибо!

Ответ №2:

Я попытался воспроизвести это. Я предполагаю, что произошла небольшая опечатка (вы имели в виду NROF = nrow(d_sub) вместо NROF = nrow(d) ). Кроме того, вы не включили какое-либо возвращаемое значение для else регистра.

Вам это помогает?

 server = function(input, output)
{
  NROF = reactiveValues(test = 1)

  output$trendPlot= renderPlotly({
    d_sub=d[d$price >= input$slider[1] amp; d$price <= input$slider[2],]
    NROF = nrow(d_sub)
    if(NROF != 0)
    {
      plot_ly(d_sub, x=d_sub$cut, y=d_sub$color, z=factor(d_sub$color),
              type='scatter3d', mode='markers',
              sizemode='diameter', size=d_sub$price, color=d_sub$price,colors = 'Set1')

    } else {
      plot_ly(type='scatter3d')
    }
  })
}
  

Комментарии:

1. Ну, это неудобно, на самом деле вы оба дали мне очень хороший отзыв, поэтому не уверен, какой из них принять в качестве ответа 🙂 Большое вам спасибо!

2. Кроме того, вы, как и я, упустили тот факт, что он должен был использоваться как: NROF $test = ….