JavaScriptの変数をRShinyAppに保存します

4
2022.01.05

今、私はjavascriptの一部を使用してそれの一部からpdfを作成することができる素敵なRシャイニーアプリを持っています。しかし、今は自動的にダウンロードするだけです。

js <- "
$(document).on('shiny:sessioninitialized', function(event) {
  $('#printPdf_CA').click(function () {
    domtoimage.toPng(document.getElementById('mainOrder_CA'))
      .then(function (blob) {
        var pdf = new jsPDF('l', 'pt', [$('#mainOrder_CA').width(), $('#mainOrder_CA').height()]);
        pdf.addImage(blob, 'PNG', 0, 0, $('#mainOrder_CA').width(), $('#mainOrder_CA').height());
        pdf.save($('#name').val() + '.pdf');
      });
  });
});
"

私はそれをローカルに保存し (ファイルとして、または、SYアプリの変数として、相対ディレクトリまたはファイルとして)、それをpdf(上記のような)に印刷するか、選択したadressに電子メールで送信するか(Rのemayiliパッケージを使用して)選択した方法をユーザーに提供したい。私はshiny.setInputValue()を試してみましたが、それはまったくうまくいきませんでした(Javascriptから番号を送信するだけではうまくいかなかったようですが、ここで何か間違っているかもしれません。

私は本当にあなたの助けに感謝します!

編集 私はShiny.setinputValue()を動作させましたが、フィールドから一時的な.pdfファイルに書き込む方法がわかりません。私はまた、これはまだ正式にpdfとして認識されているのか、Rに移動したときに何らかの情報損失があったのか疑問に思います

編集2: 基本的に私は次の調整されたコードで光沢のある入力としてRにPDFを送信するために管理します:

$(document).on('shiny:sessioninitialized', function(event) {
var pdf
  $('#storePDF').click(function () {
    domtoimage.toPng(document.getElementById('Capture'))
      .then(function (blob) {
        pdf = new jsPDF('l', 'pt', [$('#Capture').width(), $('#Capture').height()]);
        pdf.addImage(blob, 'PNG', 0, 0, $('#Capture').width(), $('#Capture').height());
        Shiny.setInputValue('pdf', pdf)
      });
  });
});

今、私はちょうどこれからRでPDFを作成することができる必要があります。しかし、結果のファイルはリストと様々なコンポーネントのリスト(おそらく何らかの形でPDFを記述する大きな構造)です。

これをコンソールに出力すると、次の出力が得られます。

$internal
$internal$collections
$internal$collections$addImage_images
$internal$collections$addImage_images$`0`
$internal$collections$addImage_images$`0`$alias
[1] 1916164677

$internal$collections$addImage_images$`0`$w
[1] 1905

$internal$collections$addImage_images$`0`$h
[1] 880

$internal$collections$addImage_images$`0`$cs
[1] "DeviceRGB"

$internal$collections$addImage_images$`0`$bpc
[1] 8

..... And much more......

この種の物をpdfに変える方法はありますか?

編集 3:

興味のある人のための私の半分まともな解決策は、単にシャイニー(Shiny.setInputValue)に「ブロブ」を移動することでした

Base64デコーダーを使用するよりも

マジックを使用して画像を読み取る::image_readとマジックを使用してpdfを誘惑に書き込む::image_write

回答
2
2022.01.14

次に私の投稿からコピーするときは、リンクを渡してください、これは簡単だったでしょう。

base64 エンコード/デコードを使用して、次の手順を実行できます。

library(shiny)
library(base64enc)

js <- "
$(document).ready(function(){
  $('#printPdf').click(function () {
    domtoimage.toPng(document.getElementById('frame_print'))
      .then(function (blob) {
        var pdf = new jsPDF('l', 'pt', [$('#frame_print').width(), $('#frame_print').height()]);
        pdf.addImage(blob, 'PNG', 0, 0, $('#frame_print').width(), $('#frame_print').height());
        pdf.save('test.pdf');
      });
  });
  $('#getPdf').click(function () {
    domtoimage.toPng(document.getElementById('frame_get'))
      .then(function (blob) {
        var pdf = new jsPDF('l', 'pt', [$('#frame_get').width(), $('#frame_get').height()]);
        pdf.addImage(blob, 'PNG', 0, 0, $('#frame_get').width(), $('#frame_get').height());
        var b64 = pdf.output('datauristring');
        Shiny.setInputValue('b64pdf', b64);
      });
  });
});
"

ui <- fluidPage(
  tags$head(
    tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"),
    tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js"),
    tags$script(js)
  ),
  br(),
  actionButton("printPdf", "PRINT", class = "btn-primary"),
  div(
    id = "frame_print",
    style = "border: 2px solid black;",
    h3("Click on the button to print me as PDF")
  ),
  br(),
  actionButton("getPdf", "GET", class = "btn-info"),
  div(
    id = "frame_get",
    style = "border: 2px solid red;",
    h3("Click on the button to get me as PDF")
  ),
  br(),
  conditionalPanel(
    "input.b64pdf !== undefined",
    downloadButton("dwnld")
  )
)

server <- function(input, output, session){
  
  observeEvent(input[["getPdf"]], {
    showNotification(
      "PDF base64 string stored in `input$b64pdf`.",
      type = "message"
    )
  })
  
  output[["dwnld"]] <- downloadHandler(
    filename = "Test.pdf",
    content = function(file){
      mybase64 <- input[["b64pdf"]]
      conn <- file(file, open = "wb")
      base64decode(substr(mybase64, 51L, nchar(mybase64)), output = conn)
      close(conn)
    }
  )
  
}

shinyApp(ui, server)