Здесь много правильных ответов, но я хотел добавить это (для полноты):
Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.
Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.
template class vector<int>;
Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.
Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>
, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.
Вы используете макет Bootstrap (fluidPage
, fluidRow
, column
), и вся идея такого макета заключается в отзывчивости.
Страница считается шириной 12, и превышение ее элементов приведет к переносу в новые строки. Это предполагаемое поведение Bootstrap.
Одним из способов решения вашей проблемы является использование flexbox .
Решение : (Отказ от ответственности: работает только на Chrome и Firefox)
Я внес два изменения в ваш код:
column
на div
с пользовательским классом CSS под названием custom-column
. column(4,x)
- div(class = "custom-column", x)})
flex-nowrap
в fluidRow
. fluidRow(class="flex-nowrap", lapply(alld$ui,function(x){div(class = "custom-column", x)}))
С этими изменениями макет работает, как вы и предполагали, в chrome и firefox , но не работает в IE или браузере в RStudio.
Полный код, включая классы CSS flex-nowrap
и custom-column
:
library(shiny)
ui <- fluidPage(
fluidRow(
tags$head(tags$style("
.flex-nowrap {
display: inline-flex;
-webkit-flex-wrap: nowrap !important;
-ms-flex-wrap: nowrap !important;
flex-wrap: nowrap !important;
flex-direction: row;
}
.custom-column {
width: 200px;
margin: 0px 10px;
}
"
)),
actionButton("addCol","Add New Column"),
div(style="overflow-x: auto;",
uiOutput("myUI")
)
)
)
server <- function(input, output, session) {
alld <- reactiveValues()
alld$ui <- list()
observeEvent(input$addCol,{
alld$ui[[length(alld$ui)+1]] <- verbatimTextOutput("aaa", placeholder = T)
output$myUI <- renderUI({
fluidRow(class="flex-nowrap", lapply(alld$ui,function(x){div(class = "custom-column", x)}))
})})
}
shinyApp(ui, server)
Выходные данные :