gpt4 book ai didi

r - 分解 Shiny 代码的最佳实践

转载 作者:行者123 更新时间:2023-12-04 12:37:36 28 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它.

7年前关闭。




Improve this question




我正在开发一个相当复杂的 ShinyApp 来与数据交互,我只是想知道什么是分解代码的好策略。理想情况下,每个选项卡等都有单独的脚本,然后在 ui.R 和 server.R 中将它们粘合在一起。任何做过类似事情并且可以分享他们的经验和/或代码的人都会有很大的帮助。

例如,我应该如何分解不同 tabPanel 的代码

shinyUI( navbarPage("Synodos Data Explorer", id="nav",

tabPanel("Public Data",
titlePanel("Explore Public Datasets"),
source("code1.R")
),

tabPanel("Kinome Screens",
titlePanel("Exploring Kinome Screening Data"),
source("code2.R")

)

) #END navbar
) #END ShinyUI

最佳答案

你可以用我的Ramd package就是为此而设计的。先devtools::install_github('robertzk/Ramd') .现在您可以包含任意脚本(采用与 node.js 项目中相同的“异步模块化依赖”格式):

用户界面

library(Ramd)
define('public_data', function(public_data) {
shinyUI( navbarPage("Synodos Data Explorer", id="nav",
public_data, kinome_screens
))
})

public_data.r
tabPanel("Public Data",
titlePanel("Explore Public Datasets"),
source("code1.R")
)

kinome_screens.r
tabPanel("Kinome Screens",
titlePanel("Exploring Kinome Screening Data"),
source("code2.R")
)

解释
define函数允许您包含相对于当前执行文件所在目录的 R 脚本。例如,如果您想将代码结构化为目录格式,您可以执行以下操作:
define('dir/some_file', 'dir2/some_other_file', function(one, two) {
# You can use one and two, the "return value" (last expression) in the
# above files
})

请注意,正确使用它完全消除了对全局变量的使用,并将解决您管理全局状态和代码组织问题。这背后的主要技巧是,当您获取文件时,如下所示:
# test.r
c(1,2,3) # This will be ignored, since it isn't at the end of the file
list(1, "hello!")

# otherfile.r
x <- source('test.r')$value

然后 x现在是 list(1, "hello!") (特别是,像这样调用 base::source 的“返回值”将始终给出文件中的最后一个表达式。您想要传递给包含该文件的其他文件的所有内容都应该在最后包装起来,可能在一个列表,如果你想返回多个东西。你可以使用它来将你复杂的 Shiny 项目分层嵌套在一个健全的组织结构中。

这是一个完整的工作示例,说明了如何使用 Ramd 在目录中构建一些代码:
### main.r
define('blah/foo', 'blah2/faa', function(one, two) {
print(one + two)
})

### blah/foo.r
x <- 1
y <- 2
x + y

### blah2/faa.r
z <- 1
w <- 5
w - z

### R console
library(Ramd); source('main.r')
# [1] 7

关于r - 分解 Shiny 代码的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25084281/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com