2017-07-21 38 views
13

我有以下閃亮,應用程序,組織方式如下如何編程生成模板[R代碼和目錄結構

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

例如,server.R包含此行:

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

我m尋找一種方式來自動生成應用程序目錄和文件內容。例如,如果我們定義兩個參數:

  1. 應用程序名稱mycool_app

  2. 輸入文件:bar.txt

之後,將根據在base_app定義的模板生成此。

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

而且新server.R將包含infile <- "bar.txt"。我看着 whisker。但它不提供文件內編碼的模板,只能通過字符串。我正在考慮能力ala Python's Jinja2

在R中做這件事的最好方法是什麼?


更新

又如爲ui.R

# 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. 

內容choices_listselected_choicesanalysis_namefc_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") 

或者你想跳回到bar.txt的內容插入server.R什麼?

關於更新的問題:

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