このために設計された私のRamd パッケージを使用できます。まずdevtools::install_github('robertzk/Ramd')
。これで、任意のスクリプトを含めることができます (node.js プロジェクトで見られるのと同じ「非同期モジュラー依存関係」形式で):
ui.r
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