Как я могу создать метку на гистограмме?

Я просто собрал хорошую структуру данных и цепочку обработки, чтобы генерировать это поведение переключения, никакие библиотеки не нужны. Я уверен, что это будет реализовано много раз, и наткнулся на эту тему, ища примеры - подумал, что я запишу.

Мне даже не нужны флаги (единственный флаг здесь режим отладки, создающий переменную, которую я проверяю как условие запуска нисходящей функции if (!exists(debug.mode)) {...} else {print(variables)}). Операторы проверки флагов lapply ниже имеют то же значение, что:

if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args) 

, где args - переменная, считываемая из аргументов командной строки (вектор символов, эквивалентный c('--debug','--help'), когда вы поставляете их, например)

Он может использоваться повторно для любого другого флага, и вы избегаете всего повторения, а не библиотеки поэтому нет зависимостей:

args <- commandArgs(TRUE)

flag.details <- list(
"debug" = list(
  def = "Print variables rather than executing function XYZ...",
  flag = "--debug",
  output = "debug.mode <- T"),
"help" = list(
  def = "Display flag definitions",
  flag = c("-h","--help"),
  output = "cat(help.prompt)") )

flag.conditions <- lapply(flag.details, function(x) {
  paste0(paste0('"',x$flag,'"'), sep = " %in% args", collapse = " || ")
})
flag.truth.table <- unlist(lapply(flag.conditions, function(x) {
  if (eval(parse(text = x))) {
    return(T)
  } else return(F)
}))

help.prompts <- lapply(names(flag.truth.table), function(x){
# joins 2-space-separatated flags with a tab-space to the flag description
  paste0(c(paste0(flag.details[x][[1]][['flag']], collapse="  "),
  flag.details[x][[1]][['def']]), collapse="\t")
} )

help.prompt <- paste(c(unlist(help.prompts),''),collapse="\n\n")

# The following lines handle the flags, running the corresponding 'output' entry in flag.details for any supplied
flag.output <- unlist(lapply(names(flag.truth.table), function(x){
  if (flag.truth.table[x]) return(flag.details[x][[1]][['output']])
}))
eval(parse(text = flag.output))

Обратите внимание, что в flag.details здесь команды хранятся как строки, а затем оцениваются с помощью eval(parse(text = '...')). Optparse, очевидно, желательно для любого серьезного скрипта, но код минимальной функциональности Хорошее тоже иногда.

Пример вывода:

$ Rscript check_mail.Rscript --help
--debug Print  variables rather than executing function XYZ...

-h  --help  Display flag definitions

0
задан Koen Hollander 18 January 2019 в 13:14
поделиться

1 ответ

У меня нет готового решения, но я мог бы подумать о двух возможных решениях.

  1. Вы должны иметь возможность создать пользовательскую легенду, как описано здесь: https://c3js.org/samples/legend_custom.html , а затем переместить эти метки на соответствующие столбцы. используя translate / transform и D3js.

  2. Вы можете попробовать переместить существующие метки с помощью D3 и перевести / преобразовать.

0
ответ дан gothmogg 18 January 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: