该程序包将Shiny应用程序与数据集一起嵌入。软件包源位于GitHub上。
嵌入式数据集用于在加载包时以惰性方式填充ui(字段Input1)和数据集(在data / data_test.rda中,具有3个字段{year_p,model_p,volume_p}的数据帧)(说明文件参数LazyData设置为true)。
此数据在整个会话期间保持不变,因此我不想为其提供响应功能。 问题是,如果我使用数据集填充用户界面,则该软件包将无法构建,并且在构建时会产生错误
我考虑的替代方法是:
具有反应性函数(model_reactive())和server.R中定义的watchEvent / updateSelectInput,但这似乎效率很低。顺便说一句,有没有一种方法可以让反应函数只计算一次?
将处理数据集的代码放在global.R中,以便数据可用于server.R和ui.R
也许这个post解释了如何处理环境,但我没有理解。
r
shiny::selectInput("Input1", "Input1:", choices = model_ls, multiple = F, selectize = F)
# error when building the package
# ERROR: lazy loading failed for package 'TESTshinyapp'
r
model_ls <- input_model(dat)
r
input_model <- function(data) {dplyr::select(data, model_p) %>% dplyr::distinct() %>% unlist()}
答案 0 :(得分:0)
问题的根源在于,分析软件包的功能时,数据集{"_id":11,"filename":"./manchester.geojson","document":{"properties":{"id":11,"borough":"Didsbury"},"geometry":{"removed":0}}}
{"_id":12,"filename":"./manchester.geojson","document":{"properties":{"id":12,"borough":"Chorlton"},"geometry":{"removed":0}}}
超出范围。这种现象是预期的,大多数程序包都通过使用根据需要动态加载数据集的函数来解决此问题。
一个简单的解决方法就是做到这一点:将应用程序的ui定义为函数
data_test
这样,当应用启动时,数据将动态加载,就像服务器中一样。 (注意:在您的实际软件包中,library(shiny)
ui <- function() {
data(data_test, package = "TESTshinyapp")
fluidPage(
"Names of the dataset: ",
paste(names(data_test), collapse = ", ")
)
}
server <- function(input, output, session) {
}
shinyApp(ui(), server)
也需要转换为函数才能起作用。)
另一种可能性是将数据加载到sidebar
中,然后
使用factory pattern创建launchApp
和ui
。换句话说:将数据集放入server
中的范围内,然后作为参数传递给工厂。
launchApp
此模式还允许您为server_factory <- function(myData) {
function(input, output, session) {
## use myData here as you please
}
}
ui_factory <- function(myData) {
fluidPage(
"Names of the dataset: ",
paste(names(myData), collapse = ", ")
)
}
launchApp <- function() {
data(data_test, package = "TESTshinyapp")
shinyApp(
ui_factory(data_test),
server_factory(data_test)
)
}
launchApp()
定义参数,并根据需要将其传递给工厂。