Подтвердить что ты не робот

Как программно генерировать R-коды и структуры каталогов с шаблоном

У меня есть следующее Shiny-приложение, организуйте следующий путь

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

Например, server.R содержит следующие строки:

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

Я ищу способ автоматического создания каталога приложения и содержимого файла. Например, если мы определяем 2 параметра:

  • Имя приложения mycool_app

  • Входной файл: bar.txt

после этого он будет генерировать это на основе шаблона, определенного в base_app.

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

И новый server.R будет содержать infile <- "bar.txt".

Я посмотрел whisker. Но он не предоставляет шаблон, закодированный внутри файла, только через строку. Я думаю о способности ala Python 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_list, selected_choices, analysis_name, fc_slider_threshold будет предоставлено для включения во вновь созданный mycool_app.

4b9b3361

Ответ 1

Не уверен, правильно ли я понял, что вам нужно, но этот фрагмент кода, кажется, делает то, что вы хотите

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}