私はプログラミング、R、シャイニー、および ggvis の初心者であり、ユーザー入力に基づくリアクティブなデータ更新に頭を悩ませようとしています。以下は、私が構築しようとしているタイプの時間経過プロットを含む光沢のあるアプリの再現可能な例です。
アプリが実行され、ユーザー入力が変更されると更新されます。ただし、プロットは、「マッピング」構文 ( = ) を使用して ggvis() 呼び出しで x、y、およびサイズ変数が呼び出された場合にのみ更新されます。私の直感では、「設定」構文 ( := ) または ( ~ ) 演算子を使用すると、次の問題を解決できます。
問題は、ユーザー入力が変更されたときに新しいプロットが生成され、その新しいプロットがクライアントに送信されるのではなく、データ ポイントを動的に更新することです。プロットを新しい (x,y,サイズ)位置。
ggvis が特定のデータ ポイント (データ フレームの個々の列から取得した x、y、およびサイズの値) を更新されたデータ ポイント (そのデータの同じ行にある 3 つの異なる列) にバインドする方法については、まだ構文的に満足していません。フレーム)。私が探している種類の更新を可能にする 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"))
)
)
)
)
サーバー.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)
})