2017-07-21 6 views
13

でRコードとディレクトリ構造を生成するには、たとえば次のようは、私は、次のシャイニーアプリを持ってどのようにプログラム的にテンプレート

-- base_app 
    |-- server.R 
    |-- ui.R 
    `-- www 

を整理し、server.Rは、この行が含まれています。

infile <- "foo.txt" 
# do something with infile 

私は」アプリのディレクトリとファイルの内容を自動的に生成する方法を探しています。

  1. アプリケーション名mycool_app

  2. 入力ファイル:bar.txt

はその後、それがbase_appで定義されたテンプレートに基づいて、これを生成します。例えば、私たちは2つのパラメータを定義した場合。

-- mycool_app 
    |-- server.R 
    |-- ui.R 
    `-- www 

そして新しいserver.Rinfile <- "bar.txt"が含まれています。

私は whiskerを見ました。しかし、文字列を通してのみファイル内にエンコードされたテンプレートは提供されません。私は能力ala Python's Jinja2を考えています。

Rでこれを行う最良の方法は何ですか?


更新ui.Rため

もう一つの例:choices_listselected_choicesanalysis_name

# Example of ui.R 
# Choices differs from analysis to analysis 
# Hand coded 
# --------------------------- 
choices_list <- list(
       "A. Rumef.XXX vs Salt"   = "Group_A.Rumef.XXX_vs_Salt.iv", 
       "B. Bra.XXX vs Salt"    = "Group_B.Bra.XXX_vs_Salt.iv", 
       "C. Salt.Rumef vs Bra"   = "Group_C.Salt.Rumef_vs_Bra.iv", 
       "D. XXX.Rumef vs Bra"    = "Group_D.XXX.Rumef_vs_Bra.iv" 
               ) 
selected_choices <- "Group_A.Rumef.XXX_vs_Salt.iv" 
analysis_name <- "Cool Analysis" 
fc_slider_threshold <- 0.8 

# Do more things with those variables. 

コンテンツ、fc_slider_thresholdは、新しく生成されたmycool_appに含まれるように供給されることになります。

+0

です。あなたの質問とアプリのフォルダ全体をある場所から別の場所にコピーするだけの違いは何ですか? – Florian

+0

@Florian私は多くのパラメータセットを持っており、それを使って複数のアプリを作成したいと考えています。そのShiny-apps世代を自動化したい。 – pdubois

+0

申し訳ありませんが、まだ100%クリアしていません。私は 'infile < - " foo.txt "'を含むserver.Rを見て、そのserver.Rファイルも別のフォルダに作成されます。あなたはどんな種類のパラメータを持っていて、どのような動作を期待していますか?今はfile.copy()がうまくいくように見えます。 – Florian

答えて

9

ない私が正しくあなたが必要なものを理解している場合確認が、コードのこの作品は、あなたが

genAppStr <- function(appname, infile) { 
    dir.create(appname) 
    dir.create(paste0(appname, "/www")) 
    file.create(paste0(appname, "/", c("server.R", "ui.R"))) 
    writeLines(paste0("infile <- '", infile, "'"), paste0(appname, "/server.R")) 
} 

genAppStr("mycool_app", "bar.txt") 

それとも、server.Rにbar.txtの内容を挿入したいん欲しいものをやっているように見えますか?更新質問に関しては

genAppStr1 <- function(appname, infile, pars) { 
    dir.create(appname) 
    dir.create(paste0(appname, "/www")) 
    file.create(paste0(appname, "/", c("server.R", "ui.R"))) 
    infilec <- readLines(infile) 
    glued <- sapply(infilec, function(x) with(pars, glue(x)), USE.NAMES = FALSE) 
    writeLines(as.character(glued), paste0(appname, "/server.R")) 
} 

使用法:

library(glue) 

ch <- c("A. Rumef.XXX vs Salt"   = "Group_A.Rumef.XXX_vs_Salt.iv", 
    "B. Bra.XXX vs Salt"    = "Group_B.Bra.XXX_vs_Salt.iv", 
    "C. Salt.Rumef vs Bra"   = "Group_C.Salt.Rumef_vs_Bra.iv", 
    "D. XXX.Rumef vs Bra"    = "Group_D.XXX.Rumef_vs_Bra.iv") 

options(useFancyQuotes = FALSE) 

vsQuote <- Vectorize(sQuote, USE.NAMES = FALSE) 

makeChoiceList <- function(ch) { 
    nms <- vsQuote(names(ch)) 
    chs <- vsQuote(ch) 
    chnm <- paste(nms, chs, sep = " = ") 
    paste0('list(', paste(chnm, collapse = ","), ')') 
} 

genAppStr1(
    "mycool_app", "infile.txt", 
    pars = list(
    par1 = makeChoiceList(ch), 
    par2 = sQuote("Group_A.Rumef.XXX_vs_Salt.iv"), 
    par3 = sQuote("Cool Analysis"), 
    par4 = 0.8 
) 
) 

infile.txtの内容は、私は理解していない

choices_list <- {par1} 
selected_choices <- {par2} 
analysis_name <- {par3} 
fc_slider_threshold <- {par4} 
+0

ありがとうございます。より複雑なサーバーコード(複数の行など)がある場合はどうすればいいですかテンプレートがないと便利でしょうか? – pdubois

+2

おそらくあなたはそれのための接着剤を使用することができます。どのような種類のサーバーの簡単な例を与えることができますか?あなたは生成するでしょうか? – nokiddn

+0

私の更新を確認してください。 – pdubois

関連する問題