【问题标题】:Automatic GUI Generating in R Shiny在 R Shiny 中自动生成 GUI
【发布时间】:2014-06-07 05:50:06
【问题描述】:

我遇到的问题是我无法在 Shiny 中自动生成 GUI。这个想法是查看有多少文件并为每个文件生成一组图像+按钮。我相信这个问题的解决方案是 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") 和标签成为变量,其中最后一个数字在每个循环中递增。

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 页面源代码中所见)是:

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

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

不胜感激。

【问题讨论】:

  • 我想你想要tagList,可能还有renderUI。如果您花一点时间熟悉apply 系列函数,我希望您可以使用tagList(lapply( &lt;your code here&gt;))
  • 我以后如何将它与“听众”联系起来?知道我可以在哪里获得更多帮助,因为似乎没有人对 stackoverflow 做出回应! :(
  • 谢谢杰夫!我会检查链接!到目前为止,我已经看到了闪亮的高级示例,似乎没有一个具有我想要做的事情。呃……
  • 嘿,我浏览了教程并发布在邮件列表中,但没有找到这样的示例,教程中也没有解释如何围绕 renderImage 或使用 for 循环来渲染 UI,以及以后如何在 af 或 loop 或类似的东西中接收这些参数。那里的一切都只展示了如何静态放置图像,而不是如何动态生成 UI :(。我完全迷路了。

标签: r user-interface shiny shiny-server


【解决方案1】:

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

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

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

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

uiOutput(nameOfTheFunctionThatReturnedTheList)

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

【讨论】:

    【解决方案2】:

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

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

    以下是工作版本的代码。

    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())})
    })
    

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2021-11-23
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多