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 输出(如在右 tlick/view page source 中看到的)是:

<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

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

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

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

该列表必须由函数返回。所有这些都在 server.R 中。在 ui.R 中应该写:

uiOutput(nameOfTheFunctionThatReturnedTheList)

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

于 2014-04-28T22:33:26.680 回答
0

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

  1. 定义一个创建所需类型小部件的函数。给它一个参数,一个整数,然后使用“paste0”将该整数附加到小部件的名称中。
  2. 定义一个反应性对象,该对象将函数应用于整数向量并使用 . 将结果作为列表返回lapply
  3. 定义一个输出对象,使用renderUI它返回内部的反应对象tagList

以下是工作版本的代码。

用户界面

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 回答