Я новичок в программировании, R, shiny и ggvis, пытаюсь осмыслить реактивное обновление данных на основе ввода данных пользователем. Ниже приведен воспроизводимый пример блестящего приложения, содержащего график динамики изменений того типа, который я пытаюсь построить.
Приложение должно запускаться и обновляться при изменении пользовательского ввода. Однако график обновляется только тогда, когда переменные x, y и size вызываются в вызове ggvis () с использованием синтаксиса «сопоставления» (=). Моя интуиция подсказывает, что использование синтаксиса "настройки" (: =) или оператора (~) поможет решить следующую проблему:
Проблема в том, что вместо того, чтобы генерировать новый график при изменении пользовательского ввода и этот новый график отправляется клиенту, я хотел бы, чтобы точки данных обновлялись динамически - пролетали по графику до их новых (x, y, размер) положение.
Я еще не уверен в синтаксисе того, как ggvis связывает заданную точку данных (со значениями x, y и размера, взятыми из отдельных столбцов фрейма данных) с обновленной точкой данных (из трех разных столбцов в одной строке этих данных. Рамка). Есть ли в ggvis в настоящее время функциональные возможности, позволяющие выполнять то обновление, которое я ищу?
ui.R
library(shiny)
library(ggvis)
shinyUI(pageWithSidebar(
headerPanel=headerPanel("Reactive Data Update Problem"),
sidebarPanel=sidebarPanel(
selectInput("timePoint",
"Choose Time Point:",
list("time1" = 1,
"time2" = 2
)
)
),
mainPanel=mainPanel(
tabsetPanel(
tabPanel('Plot',
ggvis_output("myDotPlot")),
tabPanel('Table',
dataTableOutput("myDataTable"))
)
)
)
)
server.R
library(shiny)
library(ggvis)
# Create sample dataset
time1x <- rexp(500, 2)
time1y <- rexp(500, 1)
time1s <- abs(log2(time1x/time1y))
time2x <- rexp(500, .02)
time2y <- rexp(500, .01)
time2s <- abs(log2(time2x/time2y))
myDataTable <- data.frame( "time1x" = time1x
, "time1y" = time1y
, "time1s" = time1s
, "time2x" = time2x
, "time2y" = time2y
, "time2s" = time2s
)
# Define paster functions allowing an input integer to represent a d.f column
xFormat <- function(timePoint) { paste("time", timePoint, "x", sep = "") }
yFormat <- function(timePoint) { paste("time", timePoint, "y", sep = "") }
sFormat <- function(timePoint) { paste("time", timePoint, "s", sep = "") }
# Define server logic necessary to produce plot
shinyServer(function(input, output, session){
myDotPlot <- reactive({
ggvis(myDataTable, props( x = as.name(xFormat(input$timePoint))
, y = as.name(yFormat(input$timePoint))
, size = as.name(sFormat(input$timePoint))
)
) + mark_point()
})
output$myDataTable = renderDataTable({myDataTable})
observe_ggvis(myDotPlot, 'myDotPlot', session)
})