R Shiny中的自动GUI生成

时间:2014-04-22 17:42:24

标签: r user-interface shiny shiny-server

我遇到的问题是我无法在Shiny中自动生成GUI。我们的想法是查看有多少文件,并为每个文件生成一组Image +按钮。我相信这个问题的解决方案是在R。

ANY 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和#34;),标签是变量,其中最后一个数字递增每个循环。

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>

我无法弄清楚如何生成这个,因为我不知道如何以及在何处插入对图像的引用。

非常感谢帮助。

2 个答案:

答案 0 :(得分:0)

感谢Jeff在评论部分的帮助,我得到了一些循环并生成UI元素的东西。

整个技巧是有一个renderUI函数,里面有一个for循环,它在列表中累积元素,在我的例子中是:

LL[[i]] <- list(actionButton(txt,icon=imageOutput(pp,width="100px",height="100px"),label=dir))

此列表必须由函数返回。这一切都在server.R中。在ui.R中,应该写:

uiOutput(nameOfTheFunctionThatReturnedTheList)

然而我的问题仍然是我无法使用相同的循环显示图像...帮助任何人? ;)

答案 1 :(得分:0)

我对此问题的解决方案如下:

  1. 定义一个创建所需小部件类型的函数。给它一个参数,一个整数,并使用`paste0'将该整数附加到小部件的名称。
  2. 定义一个反应对象,将该函数应用于整数向量,并使用lapply将结果作为列表返回。
  3. 使用renderUI定义输出对象,该对象返回tagList内的被动对象。
  4. 以下是工作版的代码。

    <强> ui.R

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

    <强> server.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())})
    })