Блестящий: добавить линию регрессии без изменения данных - PullRequest
0 голосов
/ 23 января 2019

Я пишу блестящее приложение, которое регулирует количество разброса на графике.Данные генерируются через rnorm().Я отображаю график с ggplot2.Я хочу показать или скрыть линию регрессии на основе значения флажка.Это все работает.

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

Я пытался использовать как geom_smooth, так и geom_abline (закомментировано в коде), но обазаставить данные быть восстановленными.

Вопрос: Можно ли добавить / удалить линию регрессии без изменения данных? То есть расположение точек должно меняться только при смене ползунка, но не флажка.

library(shiny)
library(ggplot2)

set.seed(42)

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      sliderInput("stdev",
                  "Amount of error:",
                  min = 0,
                  max = 0.8,
                  value = 0.34),
      checkboxInput("showLM", "Show regression line?",
                    value = TRUE)
    ),

    mainPanel(
      plotOutput("regrPlot")
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

  output$regrPlot <- renderPlot({

    regrData <- reactive({
      pl <- rnorm(50, mean = 4.3, sd = 0.44)
      error <- rnorm(length(pl), 0, input$stdev)
      sl <- 2.41 + (0.828 * pl) + error

      tibble(pl, sl)

    })

    # For use with abline
    coefs <- lm(sl ~ pl, data = regrData())$coefficients

    p1 <- ggplot(data = regrData(), aes(x = pl, y = sl)) + 
      geom_point()

    # Try with geom_abline
    # p2 <- {if (input$showLM) p1 + 
    #     geom_abline(slope = coefs[2],
    #                 intercept = coefs[1]) 
    #   else p1}

   p2 <- {if (input$showLM)
     p1 + geom_smooth(method = "lm",
                      se = FALSE)
     else p1}

    print(p2)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

Создан 2019-01-23 с помощью пакета Представить (v0.2.1)

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Как я и написал в комментарии, альтернативой является установка set.seed() в реактивной функции.

Внутри вашей реактивной функции находится другая среда. Ваше семя там больше не определяется ... Если вы поместите семя в реактивную функцию, оно должно работать. Более подробную информацию о области видимости можно найти здесь: https://shiny.rstudio.com/articles/scoping.html.

Пример для лучшего понимания:

library(shiny)
set.seed(1)
print("set seed outside server function:")
print(rnorm(1))
ui <- fluidPage(

)

server <- function(input, output, session) {
  observe({
    print("new environment seed not valid")
    print(rnorm(1))
  })

  observe({
    print("new environment but set seed here as well")
    set.seed(1)
    print(rnorm(1))
  })
}

shinyApp(ui, server)
0 голосов
/ 23 января 2019

Проблема здесь в том, что вы помещаете свой reactive в свой renderPlot, чтобы код запускался каждый раз, когда renderPlot становится недействительным.

Вместо этого вы должны переместить reactive наружу в основную server функцию. Тогда он будет запущен, только если его значение станет недействительным из-за изменений в input$stdev.

Однако вы всегда должны будете повторно визуализировать ggplot при добавлении линии регрессии. Насколько я знаю, нет способа добавить строку в ggplot без повторного рендеринга всего графика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...