Коды не анимируют изменения в shiny в R

#r #shiny

#r #shiny

Вопрос:

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

Заранее благодарю вас!

Вот коды:

 library(shiny)

df <- data_frame(x = c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O"
),
y = c(45,55,66,55,45,45,50,50,50,64,44,60,50,50,45))

ui <- fluidPage(
  
  titlePanel("letters"),
  
  sidebarLayout(
    sidebarPanel(
      tags$b("Data:"),
      textInput("x", "x", value = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O", placeholder = "Enter letter separated by a comma, A,B,C"),
      textInput("y", "y", value = "45,55,66,55,45,45,50,50,50,64,44,60,50,50,45", placeholder = "Enter values separated by a comma with decimals as points, e.g. 50, 55.5, 5, 5.03, etc."),
      
    ),
    
    mainPanel(
      plotOutput("distPlot")
    )
  ))

server<-shinyServer(function(input, output) {
  output$distPlot <- renderPlot({
    df2 <- ave(df$y, df$y, FUN = seq_along)
    plot(df2 ~ df$y, df, pch = df$x, ylim = c(1, 20), ylab = "", axes = FALSE)
    axis(1)
    mu <- mean(df$y)
    abline(v = mu, col = "red")
    text(mu, 20, paste("Avg time:", mu), adj = -0.1, col = "red")
  }) 
})



shinyApp(ui = ui, server = server) 

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

1. Ключевая вещь, которой не хватает, — это то, что вам нужно где-то использовать переменные input$x и input$y в вашей реактивной функции renderPlot . Вы хотите отфильтровать набор данных по этим значениям?

Ответ №1:

Если вы хотите изменить передачу input$x фрейма данных и input$y создать фрейм данных внутри сервера, чтобы заставить его реагировать на изменения. Например:

 library(shiny)
library(stringr)
library(dplyr)


ui <- fluidPage(
  
  titlePanel("letters"),
  
  sidebarLayout(
    sidebarPanel(
      tags$b("Data:"),
      textInput("x", "x", value = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O", placeholder = "Enter letter separated by a comma, A,B,C"),
      textInput("y", "y", value = "45,55,66,55,45,45,50,50,50,64,44,60,50,50,45", placeholder = "Enter values separated by a comma with decimals as points, e.g. 50, 55.5, 5, 5.03, etc."),
      
    ),
    
    mainPanel(
      plotOutput("distPlot"),
      "This is a brief description text"  # can add other elements
    )
  ))

server<-shinyServer(function(input, output) {
  output$distPlot <- renderPlot({
    
    df <- data_frame(x = input$x %>% str_split(",", simplify = TRUE) %>% str_trim(),
                     y = input$y %>% str_split(",", simplify = TRUE) %>% str_trim() %>% as.numeric())
    
    df2 <- ave(df$y, df$y, FUN = seq_along)
    plot(df2 ~ df$y, df, pch = df$x, ylim = c(1, 20), ylab = "", axes = FALSE)
    axis(1)
    mu <- mean(df$y)
    abline(v = mu, col = "red")
    text(mu, 20, paste("Avg time:", mu), adj = -0.1, col = "red")
  }) 
})



shinyApp(ui = ui, server = server)
 

(здесь используются два дополнительных пакета: dplyr и stringr )

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

1. Ах, я вижу — вы хотите изменить сам фрейм данных? Внесет изменения в код.

2. Нет проблем! Если вы хотите добавить статический текст, вы можете ввести его в виде знаков » » в части пользовательского интерфейса под графиком (после запятой после закрывающей plotOutput скобки). Если вы хотите, чтобы он реагировал, используйте то же textInput поле и передавайте через сервер renderText/textOutput таким же образом, как вы использовали входные и выходные данные для графика выше (но отдельно от созданного вами объекта plot. Это полезно?

3. Добавили небольшой абзац «Это краткое описание текста» под графиком — это полезно?

4. Не уверен, о чем вы здесь просите? Но это может быть другой вопрос, если будет решен вопрос о реактивности ввода. разделы комментариев не всегда являются лучшим местом для дальнейшего обсуждения. Отметьте вопрос как завершенный, если на него дан ответ о том, как заставить выходные данные реагировать на вводимые пользователем данные, и вы можете настроить другой, если есть определенный ввод / интерактивность, с которой вы не можете работать.

5. Вы можете удалить plotOutput из раздела пользовательского интерфейса, и он исчезнет, если вы это имеете в виду?