10

ggvisに慣れてきて、shinyで使ってみようと思っています。ggvis がリアクティブな Shiny 式からデータを取得する方法を理解できません。ggvis GitHub リポジトリの基本アプリは次のとおりです。

ui.R:

shinyUI(pageWithSidebar(
  div(),
  sidebarPanel(
    sliderInput("n", "Number of points", min = 1, max = nrow(mtcars),
                value = 10, step = 1),
    uiOutput("plot_ui")
  ),
  mainPanel(
    ggvisOutput("plot"),
    tableOutput("mtc_table")
  )
))

サーバー.R:

library(ggvis)

shinyServer(function(input, output, session) {
  # A reactive subset of mtcars
  mtc <- reactive({ mtcars[1:input$n, ] })

  # A simple visualisation. In shiny apps, need to register observers
  # and tell shiny where to put the controls
  mtc %>%
    ggvis(~wt, ~mpg) %>%
    layer_points() %>%
    bind_shiny("plot", "plot_ui")

  output$mtc_table <- renderTable({
    mtc()[, c("wt", "mpg")]
  })
})

mtcこれは、実際には関数であるリアクティブ式です (またはそうですか?)。その結果は data.frame です。ただし、関数として ggvis にパイプされます。結果の data.frame を次のように渡そうとした場合

mtc() %>%  ggvis(~wt, ~mpg) %>%
layer_points() %>%
        bind_shiny("plot", "plot_ui")

Shiny は、「アクティブなリアクティブ コンテキストなしでは操作は許可されていません」という行に沿って不平を言い始めます。では、実際には何が起こっているのでしょうか。

私が尋ねている理由は、ggvis で使用したい追加のオブジェクトを返したいからです。より正確に言うと、x 軸と y 軸のラベルを変更したいと思います。ラベルはリアクティブ式の内部で計算されます。次のようになります。

mtc <- reactive({ list(data=mtcars[1:input$n, ],
labx = "Computed x axis label",
laby = "Computed y axis label")
   })

mtc %>% ggvis(data=data,~wt,~mpg) %>% 
    layer_points() %>%
    add_axis("x",title=labx) %>%
    add_axis("y",title=laby) %>%
    bind_shiny("plot", "plot_ui")

mtc()ggvis呼び出し内の出力の構造をどうにかして悪用することは可能ですか? または、data.frame を渡してデータを data.frame に入れることしかできませんか?

または、ggvis オブジェクトを登録する別の方法はありますか? この質問では、ggvis 出力はobserve_ggvis関数に登録されていますが、現在の ggvis バージョン (0.3) には存在しないようです。

R 3.1.1でggvisバージョン0.3.0.1と光沢のある0.10.0を使用しています

4

2 に答える 2

18

ggvis には、データセットの「ベア リアクティブ」を渡すことができます。これを行うと、ggvis は変更時にデータを自動的に再プロットしますが、プロット全体を再プロットする必要はありません。

get_rct_df = reactive({  #code to change dataset from shiny input  )}
get_rct_df %>% ggvis() #rest of plotting code %>% bind_shiny("plot")

これにより、get_rct_df からのデータが変更されるたびに、プロット内のデータ ポイントが更新されます (ただし、プロット全体は再描画されません)。これは、プロット全体 (プロット ラベル、layer_model_predictions の方程式) を再描画しないと更新できないことも意味します。

他の提案を行い、プロット全体をリアクティブでラップすることができます:

reactive({
   get_rct_df %>% 
      ggvis() #rest of plotting code %>% 
      add_axis("x", title = input$title)
}) %>% bind_shiny("plot")

これにより、プロットのタイトルやプロットの他の部分を更新できます。しかし、データを単に再プロットするのではなく、何かが変更されたときに ggvis がプロット全体を再プロットすることも強制します。両方の方法をテストすると、方法 1 の方が「スムーズ」に見えます。ggvis には、データが変更されたときの遷移アニメーションが組み込まれています。

于 2014-07-31T14:06:32.213 に答える
4

この回答で解決策を見つけました。

mtc <- reactive({ list(data=mtcars[1:input$n, ],
    labx = "Computed x axis label",
    laby = "Computed y axis label")
})

reactive({
    dl <- mtc()
    dl$data %>% ggvis(data=data,~wt,~mpg) %>% 
    layer_points() %>%
    add_axis("x",title=dl$labx) %>%
    add_axis("y",title=dl$laby) 
 }) %>% bind_shiny("plot", "plot_ui")

秘訣は、リアクティブへの呼び出しが評価されるため、ggvis と実際の ggvis プロットのデータを計算するプロセスを分離できることです。

于 2014-07-29T10:25:35.583 に答える