#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
из раздела пользовательского интерфейса, и он исчезнет, если вы это имеете в виду?