光沢のあるアプリrglwidgetはuserMatrixを取得して、同じ回転で別のプロットを生成します

nnn

私は光沢のあるアプリを持っていて、それにrgl3d-plotを統合しています。パッケージrenderRglwidgetから、rglwidgetwebglを使用してrglグラフィックを光沢のあるアプリに挿入するために使用しています。

アプリでは、ユーザーはグラフィックを回転させることができます。ここで、回転状態を保存したいので、userMatrixまたはmodelMatrixを使用して、ユーザーが前のグラフを離れたときと同じ回転で同様のプロットを後で生成します。

ここでは、userMatrixやその他のパラメーターを格納するJava変数について説明します。光沢のあるアプリ内から(Rコードで)それらにアクセスできますか?

rgl自体で、モデルの回転を使用rotationMatrix <- rgl.projection()$modelまたはrotationMatrix <- par3d()$modelMatrix保存できますしかし、私の場合、グラフィックはrgl自体で回転されていないため、これらの関数は役に立ちません。

私が試したのはこれです:

library(shiny)
library(rgl)
library(rglwidget)

ui <- fluidPage(
  rglwidgetOutput("3D-plot"),
  actionButton("showMatrix", "show rotation Matrix")
)

server <- function(input, output, session){
  open3d(useNULL = T)
  x <- sort(rnorm(1000))
  y <- rnorm(1000)
  z <- rnorm(1000) + atan2(x, y)
  plot3d(x, y, z, col = rainbow(1000))
  scene1 <- scene3d()
  rgl.close()

  output$"3D-plot" <- renderRglwidget({
    rglwidget(scene1)
  })
  observe({
    input$showMatrix
    par3d()$modelMatrix
  })
}


shinyApp(ui=ui, server=server)

しかし、par3d()$modelMatrix何も返さないようです。

マイクワイズ

その理由は、rgl:par3d()何も返さないためであるrglパッケージは実際に光沢のためのシーンを管理していません。rglwidget活用するjavascriptベースのライブラリがそれWebGLを管理しており、シーンを別の非常に互換性のあるGLライブラリにコピーして(おそらく同じコンパイル済みライブラリを使用しているかもしれませんが、疑わしいです)、それを光沢のある状態で表示しています。だからrgl.dev()あなたを助けません。

AFAIK、これらの値はrglwidgetjavascriptに隠されているため、簡単に取得することはできませんが、取得したかったので、それを実行できる光沢のあるカスタム入力コントロールを作成しました。それはかなりの量の作業であり、もっと簡単な方法があるかもしれませんが、私はそれを見ませんでした、そして少なくとも今は光沢のあるカスタム入力コントロールを構築する方法を知っています。誰かがもっと簡単な方法を知っているなら、私に教えてください。

これがjavascriptです。これはwww、光沢のあるコードと同じディレクトリに保存するサブフォルダに入ります。

rglwidgetaux.js

// rglwidgetaux control for querying shiny rglwiget

var rglwidgetauxBinding = new Shiny.InputBinding();
$.extend(rglwidgetauxBinding, {
  find: function(scope) {
    return $(scope).find(".rglWidgetAux");
  },
  getValue: function(el) {
    return el.value;
  },
  setValue: function(el, value) {
  //  $(el).text(value);
     el.value = value;
  },
  getState: function(el) {
    return { value: this.getValue(el) };
  },
   receiveMessage: function(el, data) {
    var $el = $(el);

    switch (data.cmd) {
       case "test":alert("Recieved Message");
                    break;
       case "getpar3d":
                    var rglel = $("#"+data.rglwidgetId);
                    if (rglel.length===0){
                       alert("bad rglwidgetId:"+ data.rglwidgetId);
                       return null;
                    }
                    var rglinst = rglel[0].rglinstance;
                    var sid = rglinst.scene.rootSubscene;
                    var par3d = rglinst.getObj(sid).par3d;
                    this.setValue(el,JSON.stringify(par3d));
                    $el.trigger("change"); // tell myself that I have changed
                    break;
    }
  },  
  subscribe: function(el, callback) {
    $(el).on("change.rglwidgetauxBinding", function(e) {
      callback();
    });
  },
  unsubscribe: function(el) {
    $(el).off(".rglwidgetauxBinding");
  }
});
Shiny.inputBindings.register(rglwidgetauxBinding);

これがR / shinyコードです。通常のテストシーンを使用し、シーンをクエリuserMatrixしてテーブルに表示するためのボタンがあります前者はマウスで簡単に変更できるので、userMatrixではなくを使用しましたmodelMatrix。これにより、最新の値を取得していることがわかります。

「app.R」という名前は実際にはオプションではないことに注意してください。それを使用するか、ファイルを「ui.R」と「server.R」に分割する必要があります。そうしないと、上記のjavascriptファイルがインポートされません。

app.R

library(shiny)
library(rgl)
library(htmlwidgets)
library(jsonlite)

rglwgtctrl <- function(inputId, value="", nrows, ncols) {
  # This code includes the javascript that we need and defines the html
  tagList(
    singleton(tags$head(tags$script(src = "rglwidgetaux.js"))),
    tags$div(id = inputId,class = "rglWidgetAux",as.character(value))
  )
}

ui <- fluidPage(
    rglwgtctrl('ctrlplot3d'),
    actionButton("regen", "Regen Scene"),
    actionButton("queryumat", "Query User Matrix"),
    rglwidgetOutput("plot3d"),
    tableOutput("usermatrix")
)

server <- function(input, output, session) 
{
  observe({
    # tell our rglWidgetAux to query the plot3d for its par3d
    input$queryumat
    session$sendInputMessage("ctrlplot3d",list("cmd"="getpar3d","rglwidgetId"="plot3d"))
  })

  output$usermatrix <- renderTable({
    # grab the user matrix from the par3d stored in our rglWidgetAux
    # note we are using two different "validate"s here, which is quite the pain if you 
    # don't notice that it is declared in two different libraries
    shiny::validate(need(!is.null(input$ctrlplot3d),"User Matrix not yet queried"))
    umat <- matrix(0,4,4)
    jsonpar3d <- input$ctrlplot3d
    if (jsonlite::validate(jsonpar3d)){
      par3dout <- fromJSON(jsonpar3d)
      umat <- matrix(unlist(par3dout$userMatrix),4,4) # make list into matrix
    }
    return(umat)
  })

  scenegen <- reactive({
     # make a random scene
     input$regen
     n <- 1000
     x <- sort(rnorm(n))
     y <- rnorm(n)
     z <- rnorm(n) + atan2(x, y)
     plot3d(x, y, z, col = rainbow(n))
     scene1 <- scene3d()
     rgl.close() # make the app window go away
     return(scene1)
  })
  output$plot3d <- renderRglwidget({ rglwidget(scenegen()) })
}

shinyApp(ui=ui, server=server)

そして最後にこれがどのように見えるかです:

ここに画像の説明を入力してください

コマンドを追加できるように設定したことに注意してください。これに基づくコントロールを使用して、(おそらく)パラメーターやその他のものを変更できます。

また、par3dここ構造(jsonに変換されてからrglwidgetjavascriptからRに変換される)と構造rglは完全に同一はないことに注意してください。たとえばuserMatrix、WebGLは他の構造よりも名前リストとしてそれを好むようであるため、フラット化する必要がありました。期待通りにやってきた行列。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

光沢のあるアプリrglwidgetはuserMatrixを取得して、同じ回転で別のプロットを生成します

分類Dev

光沢のあるアプリでcheckboxGroupInputを使用して同じグラフにマルチプロット

分類Dev

光沢のあるアプリでプロット警告を抑制します

分類Dev

光沢のあるアプリは、複数のプロットに対してdfを1回フィルターします

分類Dev

美学の未知の問題は、光沢のあるアプリのggplotlyプロットを分解します

分類Dev

光沢のあるアプリでobserveEventを使用してプロットを表示する

分類Dev

「同じ出力を2回使用すると光沢のあるアプリは動作しません」という警告を表示する方法

分類Dev

Rプロット+光沢のあるリアクティブ結合イベント-同じチャートをクリックしてから引数を使用してチャートを更新します

分類Dev

光沢のあるアプリで複数のプロットを並べて

分類Dev

光沢のある:光沢のあるアプリで散布図をプロットしようとしていますが、ドットが1つしか表示されません

分類Dev

ggplotly()を使用して光沢のあるアプリでplotlyProxy()を使用して、プロットのレンダリングを高速化する方法

分類Dev

光沢のあるアプリの実行コードでPDFを生成し、そのPDFをユーザーにダウンロードして提供します

分類Dev

2つのSunburstRプロットを使用して光沢のあるアプリにクリックイベントを追加します

分類Dev

光沢のある: リアクティブ スライダーがプロットでエラーを生成します: 「無効な 'xlim' 値」

分類Dev

光沢のあるアプリでactionButtonまたは別のactionButtonを使用してtabItemをアクティブ化します

分類Dev

光沢のあるアプリのチェックボックスを使用して箱ひげ図をプロットします

分類Dev

同じuiOutput()から2つの光沢のあるウィジェットを同時に生成します

分類Dev

光沢のあるアプリをパッケージとして開発し、光沢のあるサーバーにデプロイする

分類Dev

光沢のあるアプリをパッケージとして開発し、光沢のあるサーバーにデプロイする

分類Dev

光沢のあるアプリをパッケージとして開発し、光沢のあるサーバーにデプロイする

分類Dev

rCharts:プロットはRStudioでは正常に機能していますが、光沢のあるアプリでは空です

分類Dev

光沢のあるアプリでggvisを使用して散布図を作成する

分類Dev

光沢のあるアプリのタイトルのdivを削除します

分類Dev

光沢のあるアプリのggplotはrstudioプロットウィンドウに移動します

分類Dev

データフレームを一度アップロードして、光沢のあるアプリのどこでも使用できます

分類Dev

光沢のある画像をプロットまたは表示するオプションを提供します

分類Dev

R / shiny:光沢のあるアプリで必要な場合にのみプロットの要素をレンダリングします

分類Dev

光沢のある別々のプロットプロット間で凡例をリンクする

分類Dev

光沢のあるアプリの入力値を `actionButton`で更新します

Related 関連記事

  1. 1

    光沢のあるアプリrglwidgetはuserMatrixを取得して、同じ回転で別のプロットを生成します

  2. 2

    光沢のあるアプリでcheckboxGroupInputを使用して同じグラフにマルチプロット

  3. 3

    光沢のあるアプリでプロット警告を抑制します

  4. 4

    光沢のあるアプリは、複数のプロットに対してdfを1回フィルターします

  5. 5

    美学の未知の問題は、光沢のあるアプリのggplotlyプロットを分解します

  6. 6

    光沢のあるアプリでobserveEventを使用してプロットを表示する

  7. 7

    「同じ出力を2回使用すると光沢のあるアプリは動作しません」という警告を表示する方法

  8. 8

    Rプロット+光沢のあるリアクティブ結合イベント-同じチャートをクリックしてから引数を使用してチャートを更新します

  9. 9

    光沢のあるアプリで複数のプロットを並べて

  10. 10

    光沢のある:光沢のあるアプリで散布図をプロットしようとしていますが、ドットが1つしか表示されません

  11. 11

    ggplotly()を使用して光沢のあるアプリでplotlyProxy()を使用して、プロットのレンダリングを高速化する方法

  12. 12

    光沢のあるアプリの実行コードでPDFを生成し、そのPDFをユーザーにダウンロードして提供します

  13. 13

    2つのSunburstRプロットを使用して光沢のあるアプリにクリックイベントを追加します

  14. 14

    光沢のある: リアクティブ スライダーがプロットでエラーを生成します: 「無効な 'xlim' 値」

  15. 15

    光沢のあるアプリでactionButtonまたは別のactionButtonを使用してtabItemをアクティブ化します

  16. 16

    光沢のあるアプリのチェックボックスを使用して箱ひげ図をプロットします

  17. 17

    同じuiOutput()から2つの光沢のあるウィジェットを同時に生成します

  18. 18

    光沢のあるアプリをパッケージとして開発し、光沢のあるサーバーにデプロイする

  19. 19

    光沢のあるアプリをパッケージとして開発し、光沢のあるサーバーにデプロイする

  20. 20

    光沢のあるアプリをパッケージとして開発し、光沢のあるサーバーにデプロイする

  21. 21

    rCharts:プロットはRStudioでは正常に機能していますが、光沢のあるアプリでは空です

  22. 22

    光沢のあるアプリでggvisを使用して散布図を作成する

  23. 23

    光沢のあるアプリのタイトルのdivを削除します

  24. 24

    光沢のあるアプリのggplotはrstudioプロットウィンドウに移動します

  25. 25

    データフレームを一度アップロードして、光沢のあるアプリのどこでも使用できます

  26. 26

    光沢のある画像をプロットまたは表示するオプションを提供します

  27. 27

    R / shiny:光沢のあるアプリで必要な場合にのみプロットの要素をレンダリングします

  28. 28

    光沢のある別々のプロットプロット間で凡例をリンクする

  29. 29

    光沢のあるアプリの入力値を `actionButton`で更新します

ホットタグ

アーカイブ