组织更大的Shiny应用程序的最佳实践是什么?
我认为最好的R实践也适用于Shiny.
这里讨论最佳R实践:如何组织大型R程序
链接到谷歌的R风格指南:风格指南
但是,我可以采用什么样的Shiny上下文中的独特提示和技巧,使我的Shiny代码看起来更好(更具可读性)?我想的是:
server.R这部分应采购?例如,如果我正在使用,navbarPage并且tabsetPanel在tabPanel添加几个UI元素后,我的每个代码都开始变得非常混乱.
示例代码:
server <- function(input, output) {
#Here functions and outputs..
}
ui <- shinyUI(navbarPage("My Application",
tabPanel("Component 1",
sidebarLayout(
sidebarPanel(
# UI elements..
),
mainPanel(
tabsetPanel(
tabPanel("Plot", plotOutput("plot")
# More UI elements..
),
tabPanel("Summary", verbatimTextOutput("summary")
# And some more...
),
tabPanel("Table", tableOutput("table")
# And...
)
)
)
)
),
tabPanel("Component 2"),
tabPanel("Component 3")
))
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
为了组织ui.R …
所有,
我第一次开始编写面向对象的R代码,并期望有多个R文件之间存在依赖关系.我是R的新手,还没有在一个巨大的脚本之外写任何东西来测试想法.是否有在线资源提供有关如何组织代码的提示?如果没有关于如何构建包的描述,我没有找到这样的指导.在这一点上,我只想以这样的方式组织代码,使得它尽可能简单地加载和交互例程集合.
感谢您提供的任何指导.
克里斯
我记得R用户写过他们使用"版本控制"(例如:"源代码控制"),我很想知道:你如何将"版本控制"与统计分析工作流程结合起来?
两个(非常)有趣的讨论谈论如何处理工作流程.但它们都没有引用修订控制元素:
对问题的长期更新:根据一些人的答案,以及评论中的Dirk的问题,我想更多地指出我的问题.
在阅读了关于" 版本控制 " 的Wiki文章(我以前不熟悉)之后,我很清楚,在使用版本控制时,我们所做的就是构建他的代码的开发结构.这种结构要么导致"最终产品",要么导致几个分支.
当建立类似的东西时,比方说,一个网站.通常有一种最终产品(网站),一路上有一些原型.
但在进行统计分析时,工作(我认为)是不同的.有时你知道你想去哪里.但更多时候,你会探索.探索清理数据集.探索不同的统计分析方法,并询问您的数据的各种问题(我正在写这篇文章,了解Frank Harrell和其他经验统计学家对数据挖掘的看法).
这就是为什么统计编程的工作流程问题(在我看来)是一个严肃而深刻的问题,引发了许多问题,更简单的问题是技术问题:
如何你解决这种紧张是我最初的好奇.第二个问题是"我可能会缺少什么?".应该遵循哪些(经验)规则,以避免使用版本控制进行统计编程时常见的陷阱?
在我的直觉中,我觉得统计编程本质上与软件开发不同(我写的不是统计编程的真正专家,在软件开发中更是如此).这是我不确定我在这里阅读的关于版本控制的哪些课程将适用的方式.
非常感谢,Tal
基本上,我在R中构建了一个相当大的预测模型,其中包含大约10~15个单独的脚本文件,用于收集,排序,分析和显示我的数据.我想保持一定程度的模块化,并从控制脚本或某种可比较的控制机制运行每个部分,而不是像以前在matlab中所做的那样.这可能在R?
我已经读过这个帖子以及它的相关主题,但是找不到这个确切的答案. 组织R源代码
统计分析/编程,正在编写代码.无论是描述性的还是推论性的,您都可以编写代码:导入数据,清理数据,分析数据和编译报告.
分析数据可能涉及许多曲折的统计程序,以及您查看数据的角度.最后,您有许多文件,包含许多代码行,可以对您的数据执行任务.其中一些是可重复使用的,你将它封装为"有好处"的功能.
这个"统计分析"过程对我来说就像"编程"一样,但我不确定每个人的感受是否一致.
术语软件开发通常用于指计算机编程的活动,计算机编程是编写和维护源代码的过程,而术语的更广泛意义包括所需软件的概念到软件的最终表现形式.因此,软件开发可能包括研究,新开发,修改,重用,重新设计,维护或导致软件产品的任何其他活动.对于通常由一组人开发的较大的软件系统,通常遵循某种形式的过程来指导软件的生产阶段.
根据这个简单的定义(以及我的拙见),这听起来非常像建立统计分析.但我想这不是那么简单.
这引出了我的问题:你能在两个活动之间勾勒出什么样的差异?
它可以是技术方面,不同的策略或工作方式,以及您认为相关的其他内容.
这个问题来自以下主题:
是否可以env()用作名称空间的替代品,如何在向其添加函数之前检查环境是否存在?
这与这个问题有关,而Brendan的建议 如何组织大型R程序? 我理解Dirk在这个问题上的观点,但是对于开发而言,将函数放入包中有时是不切实际的.
编辑:这个想法是跨文件模仿名称空间,因此能够独立加载不同的文件.如果先前已加载文件,则不需要创建环境,只需添加到.
谢谢你的想法
编辑:所以下面的代码可能相当于其他语言的命名空间: -
# how to use environment as namespaces
# file 1
# equivalent of 'namespace e' if (!(exists("e") && is.environment(e))) { e <- new.env(parent=baseenv()) }
e$f1 <- function(x) {1}
# file 2
# equivalent of 'namespace e' if (!(exists("e") && is.environment(e))) { e <- new.env(parent=baseenv()) }
e$f2 <- function(x) {2}
Run Code Online (Sandbox Code Playgroud) 在函数中包含执行函数所需的每个库是不错的做法?
例如,我的文件global.r包含了闪亮应用程序所需的几个功能.目前我在文件顶部有所有需要的包.当我切换项目/复制这些功能时,我必须加载包/将它们包含在新代码中.否则所有需要的包都包含在该函数中.当然,我必须使用新的R会话检查所有功能,但我认为从长远来看这可能有所帮助.
当我尝试加载包两次时,它不会再次加载包,但检查它已经加载.我的主要问题是,如果我以这种方式进行重组,是否会减慢我的功能?
我只看过一次练习,库调用函数内部,所以我不确定.