1

timevis パッケージは、期間を表示するのに非常に便利であることがわかりました。データを表示するために期待どおりに機能しています。

addCustomTime() 関数を使用してドラッグ可能な垂直線を追加しましたが、これもうまく機能しますが、その線の現在の値を取得できないことがわかりました。

基礎となる js ウィジェットは、要素と対話する関数を公開していますが、それらに正常にアクセスできませんでした。タイムラインによって発行されたイベントをキャッチするためにshinyjsを使用しようとしましたが、それを機能させることもできませんでした.

私はRと光沢にかなり慣れていますが、jsに関しては非常に初心者なので、これに関するトリックが欠けているだけだと思います。

私の ui.R では、timevisOutput オブジェクトを作成します。

fluidPage(
  timevisOutput("timeline")
)

「timechanged」イベントをリッスンしようとしています: http://visjs.org/docs/timeline/#Events

server.R に Shinyjs を使用してリスナーを追加すると、「mouseenter」イベントは表示されますが、「timechanged」ハンドラは起動していないようです。

onevent("mouseenter", "timeline", print("timeline: mouseenter"))
onevent("timechanged", "timeline", print("Saw timechanged!"))

visjs のドキュメントには、「選択イベントをリッスンする方法」に関する次のスニペットがあります。

timeline.on('select', function (properties) {
  alert('selected items: ' + properties.items);
});

Shinyjs::extendShinyjs() 呼び出しでそれを追加しようとしましたが、それも機能しません。うまくいったキーダウンイベントをリッスンする例を追加しました:

$(document).keypress(function(e) { alert('Key pressed: ' + e.which); });

そのため、タイムライン オブジェクトを正しく参照していないと思います。そこにある $(document) は、タイムライン要素を適切に取得する方法を認識していないと思わせます。

タイムラインの mouseenter イベントは表示されますが、timechanged イベントは表示されないため、.on() 呼び出しが必要だと思いますが、タイムライン要素を適切に参照しているとは思いません。

@timelyportfolio の最初の応答の後:

それは素晴らしい書き込みでした、ありがとう!イベントの様子を確認できました。_selected イベントは既にリッスンできましたが、見れてよかったです。

グラフでドラッグ可能な線を使用するカスタム時間値を取得しようとしています。次のように追加されます。

addCustomTime("mytimevis", Sys.Date(), "CustomTimeId")

基礎となる JavaScript ウィジェット ( http://visjs.org/docs/timeline ) のドキュメントには、イベント (「timechanged」) と、その値にアクセスするためのメソッド (「getCustomTime()」) が示されていますが、トレースにイベントが表示されず、メソッド呼び出しを機能させる方法もわかりません。

「timechanged」イベントはトレースに表示されないため、そのイベントを有効にするには、ウィジェットのドキュメントから .on() 呼び出しを行う必要があると思います。

timeline.on('select', function (properties) {
  alert('selected items: ' + properties.items);
});

理想的にはその変更をキャプチャしたいので、そのメソッド呼び出しを機能させるために取り組んできました。また、それを機能させることができれば、getCustomTime() メソッドも機能させることができるはずです!

4

2 に答える 2

4

予測

でデータを取得したいという前提でお答えしますR。私が間違っていると仮定した場合は、お知らせください。調整します。

Shiny.trace を使用したメッセージ

ご存じないかもしれませんが、私がよく使うトリックの 1 つはoptions(shiny.trace=TRUE)、WebSocket 経由で送信されたすべてのメッセージで画面をいっぱいにするというものです。次のコードを実行すると、次のようになります。

library(timevis)

data <- data.frame(
  id      = 1:4,
  content = c("Item one"  , "Item two"  ,"Ranged item", "Item four"),
  start   = c("2016-01-10", "2016-01-11", "2016-01-20", "2016-02-14 15:00:00"),
  end     = c(NA          ,           NA, "2016-02-04", NA)
)

tv <- timevis(data)

# now let's see what messages we get in Shiny
library(shiny)
options(shiny.trace=TRUE)

ui <- timevisOutput("mytimevis")
server <- function(input,output,session) {
  output$mytimevis <- renderTimevis({tv})
}

shinyApp(ui,server)

選択時の timevis からのメッセージのスクリーンショット

select に関するメッセージを強調表示しました。これは、 を観察または反応できることを示していmytimevis_selectedます。

選択イベントを観察する

では、選択したメッセージを受信したら、オフoptions(shiny.trace=FALSE)にしてコンソールに出力してみましょう。R

options(shiny.trace=FALSE)

ui <- timevisOutput("mytimevis")
server <- function(input,output,session) {
  output$mytimevis <- renderTimevis({tv})

  observeEvent(
    input$mytimevis_selected,
    {
      print(input$mytimevis_selected)
    }
  )
}

shinyApp(ui,server)

timechanged ハンドラを追加

コメントと質問の再読に基づいて、 timechangedのイベント ハンドラーを追加したいことがわかりました。このコードは、こぶを乗り越えるのに役立つと思います。

library(timevis)
library(shiny)
library(htmltools)
library(htmlwidgets)
library(magrittr)

tv <- timevis() %>%
  addCustomTime(Sys.Date() - 1, "yesterday") %>%
  # add an event handler since this is not one
  #   timevis provides
  htmlwidgets::onRender(
"
function(el,x) {
  // this will be our instance
  var tv = this.timeline;

  tv.on('timechanged', function(id, time) {
    //uncomment debugger if you want to stop here
    //debugger;
    Shiny.onInputChange(el.id + '_timechanged', {id:id, time:time})
  });
}
"
  )


shinyApp(
  ui = fluidPage(
    timevisOutput("timeline"),
    actionButton("btn", "Add time bar 24 hours ago")
  ),
  server = function(input, output) {
    output$timeline <- renderTimevis(
      tv
    )
    observeEvent(input$timeline_timechanged, {
      str(input$timeline_timechanged)
    })
  }
)

ファローアップ

私が間違った道を進んだ場合、またはこれが意味をなさない場合はお知らせください。私はあなたの痛みを感じており、このテクノロジーのブレンドのトラブルシューティングは非常に難しい場合があります.

于 2016-12-07T05:25:08.363 に答える