我遇到的问题是我无法在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>
我无法弄清楚如何生成这个,因为我不知道如何以及在何处插入对图像的引用。
非常感谢帮助。
答案 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)
我对此问题的解决方案如下:
lapply
将结果作为列表返回。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())})
})