[英]Create dynamic number of card elements in shiny flowLayout
我喜歡用卡片元素填充閃亮的應用程序中的區域。 如果沒有足夠的空間,這些項目將流入下一行。 這可以通過flowLayout
實現。
但是我不知道物品的數量,所以我需要循環創建卡片元素。 但是,當我在flowLayout
使用lapply時,所有元素都顯示在彼此下面。
如何解決此問題,使項目以相鄰的行顯示?
library(shiny)
card <- function(.img, .species, .sepal.length) {
HTML(
paste0(
'<div class="card">
<img src="', .img, '" style="width:100%">
<div class="container">
<h4><i>', .species, '</i></h4>
<hr>
<p>Sepal Length: ', .sepal.length, '</p>
</div>
</div>')
)
}
img.src <- "https://www.plant-world-seeds.com/images/item_images/000/007/023/large_square/iris_baby_blue.jpg?1500653527"
ui <- fluidPage(
tags$head(tags$style('.card {
width: 250px;
clear: both;
/* Add shadows to create the "card" effect */
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
transition: 0.3s;
}
/* On mouse-over, add a deeper shadow */
.card:hover {
box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
}
/* Add some padding inside the card container */
.container {
width: 250px;
padding: 2px 16px;
}')),
uiOutput("cards")
)
server <- function(input, output, session) {
# This looks as expected
# output$cards <- renderUI({
# shiny::flowLayout(
# cellArgs = list(
# style = "
# width: auto;
# height: auto;
# margin: 5px;
# "),
# card(img.src,
# .species = iris[1, "Species"],
# .sepal.length = iris[1, "Sepal.Length"]),
# card(img.src,
# .species = iris[2, "Species"],
# .sepal.length = iris[2, "Sepal.Length"]),
# card(img.src,
# .species = iris[3, "Species"],
# .sepal.length = iris[3, "Sepal.Length"]),
# card(img.src,
# .species = iris[4, "Species"],
# .sepal.length = iris[4, "Sepal.Length"])
# )
# })
# Now elements are below each other when using lapply
output$cards <- renderUI({
shiny::flowLayout(
cellArgs = list(
style = "
width: auto;
height: auto;
margin: 5px;
"),
lapply(1:4, function(.x) card(img.src,
.species = iris[.x, "Species"],
.sepal.length = iris[.x, "Sepal.Length"]))
)
})
}
shinyApp(ui, server)
上面的評論鏈接到了一個可行的答案,但是有一種更簡單的方法。
可以使用do.call
來擴展參數,而不是使用lapply
(它使列表混亂,使flowLayout
混亂)。
更新的服務器功能:
server <- function(input, output, session) {
output$cards <- renderUI({
# First make the cards
args <- lapply(1:4, function(.x) card(img.src,
.species = iris[.x, "Species"],
.sepal.length = iris[.x, "Sepal.Length"]))
# Make sure to add other arguments to the list:
args$cellArgs <- list(
style = "
width: auto;
height: auto;
margin: 5px;
")
# basically the same as flowLayout(cards[[1]], cards[[2]],...)
do.call(shiny::flowLayout, args)
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.