3

私が抱えている問題は、Shiny で GUI を自動的に生成できないことです。アイデアは、ファイルがいくつあるかを確認し、各ファイルに対して一連の画像 + ボタンを生成することです。この問題の解決策は、R での任意の GUI 生成の解決策であると私は信じています

各ボタンと画像のコードを記述して静的にこれを行うことはできますが、それを for ループに入れたり、server.R で画像をレンダリングして HTML として UI に渡したりすることはできません。 R. 以下に説明します。

生成したいコードは次のとおりです。

actionButton("sug1",icon=imageOutput("sug1",width="100px",height="100px"),label="First")

これにより、100x100 のクリック可能な画像が得られます。

私は次のことを試しました:

1) ui.R 内の for ループで囲み、ID("sug1") とラベルを、最後の番号が各ループでインクリメントされる変数にします。

2) 結果を蓄積し、server.R で HTML() 関数を使用して後で ui.R に出力する

output$generateImages <- renderUI({
    (...)
    for(...){
        (...)
        w <- paste(w, actionButton(paste("oc",which(dir==folders)),label=dir))
   }
   HTML(w)
   })

そして、表示したい場所の ui.R で:

htmlOutput("generateImages")

3) HTMLoutput または UIOutput を使用すると役立つはずだと推測しましたが、コードが生成する HTML 出力を考えると (右クリック/ページ ソースの表示に見られるように)、次のようになります。

<button id="sug1" type="button" class="btn action-button">
<div id="sug1" class="shiny-image-output" style="width: 100px ; height: 100px"></div>
First
</button>

画像への参照を挿入する方法と場所がわからなかったため、これを生成する方法を理解できませんでした。

助けていただければ幸いです。

4

2 に答える 2

0

この問題に対する私の解決策は次のとおりです。

  1. 目的のタイプのウィジェットを作成する関数を定義します。1 つのパラメーター (整数) を指定し、その整数を「paste0」を使用してウィジェットの名前に追加します。
  2. 関数を整数のベクトルに適用し、結果を を使用してリストとして返すリアクティブ オブジェクトを定義しますlapply
  3. renderUI内部のリアクティブ オブジェクトを返すを使用して、出力オブジェクトを定義しますtagList

以下は、動作するバージョンのコードです。

ui.R

library(shiny)
shinyUI(fluidPage(
  titlePanel("WidgetVector"),
  sidebarLayout(
    sidebarPanel(uiOutput("OnButton"),uiOutput("NumberOfWidgets")),
    mainPanel(uiOutput("WidgetVectorDisplay")
    )
  )
))

サーバー.R

library(shiny)
shinyServer(function(input, output) {
  output$OnButton=renderUI({radioButtons("TurnOn",label="On/Off",choices=c("On"=1,"Off"=2),selected=2)})
  output$NumberOfWidgets=renderUI({numericInput("WidgetCount",label="How many widgets?",value=1)})
  makeRadioButton=function(n=1){radioButtons(paste0("Radio",n),label="Pick",choices=c("a"=1,"b"=2,"c"= 3),selected=1)}
  WidgetVector=reactive({lapply(X = 1:input$WidgetCount, FUN = makeRadioButton)})
  output$WidgetVectorDisplay <- renderUI({
    if(is.null(input$TurnOn)){return()
    } else if(input$TurnOn == 2){return()
    } else tagList(WidgetVector())})
})
于 2015-12-03T11:58:05.607 に答える