4

私は、データを操作するためのかなり複雑な ShinyApp を開発中ですが、コードを除外するための適切な戦略は何かを考えています。理想的には、各タブなどに個別のスクリプトを用意し、それらを ui.R と server.R にまとめます。同様のことを行ったことがあり、その経験やコードを共有できる人は誰でも大いに役立ちます。

たとえば、さまざまな tabPanels のコードをどのように分解する必要がありますか

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
4

1 に答える 1

5

このために設計された私の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
于 2014-08-01T16:58:05.220 に答える