首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我的第一R包- 生信配置文件大全

我的第一R包- 生信配置文件大全

作者头像
生信技能树
发布于 2018-03-09 02:26:42
发布于 2018-03-09 02:26:42
1.6K00
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

大家好,我是李剑峰,生信技能树论坛的VIP小编,目前在上海交通大学医学院附属瑞金医院进行研究生阶段的学习,主要研究方向是生物信息学、医学信息学、大数据综合分析、临床诊断数据分析、DNA-seq, RNA-seq数据分析。很高兴又和读者朋友见面啦,有心的同学应该还记得我的上一篇教程:

Pecan Data Portal 系列教程(一)

很不幸,该网站被我们伟大的长城给屏蔽了,所以系列教程暂时夭折,不过,分享的脚步不会停下,下面介绍我的一个R包!

简介

configr 是我上传到CRAN的第一个R包,主要功能是解析和生成配置文件(json/ini/yaml/toml),分别用到了jsonlite,ini, yaml和RcppTOML。

configr是一个整合的并且进行了解析扩展的R包(开发动机主要是我比较烦记函数,另外解析配置文件之后很多参数还要做进一步处理),本教程将介绍常见的几种配置文件格式,以及configr的基本用法。

常见的配置文件类型

在生物信息学工具或者方法开发过程中,给用户提供一个简洁明了的配置文件进行自定义配置是一个非常好的选择。所以,为了更好的编写和解析配置文件,大家首先就要熟悉目前R语言中常用的配置文件解析工具,我下面列出了目前主要的几种配置文件格式供大家参考:

json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{  "default": {    "debug": "{{debug}} {{debug2}}"  },  "comments": {    "version": "0.2.3"  }}

参考:json.org, json examples, json-wiki

ini

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[default]debug = {{debug}} {{debug2}}[comments]version = 0.2.3

参考:ini-wiki

yaml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
default:  debug: '{{debug}} {{debug2}}'comments:  version: 0.2.3

参考:yaml.org, yaml-wiki

toml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# This is a TOML document. Jianfeng.title = "TOML Example"[default]debug = "{{debug}} {{debug2}}"[comments]version = "0.2.3"[comments.ljf]content = "Hello World!"

参考:toml-github, toml-wiki

xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="ISO-8859-1"?><!--  Copyright w3school.com.cn --><note>    <to>George</to>    <from>John</from>    <heading>Reminder</heading>    <body>Don't forget the meeting!</body></note>

参考:XML-wiki

用法

configr选择支持了json, ini, yaml, toml四种配置文件格式,下面将主要讲一下configr的基本用法,主要分为一下几块内容:配置文件格式识别、配置文件读取、配置文件的格式转换、配置文件扩展解析

格式识别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取R包configr中内置的四种配置文件library(configr)config.json <- system.file("extdata", "config.json", package = "configr")config.ini <- system.file("extdata", "config.ini", package = "configr")config.yaml <- system.file("extdata", "config.yaml", package = "configr")config.toml <- system.file("extdata", "config.toml", package = "configr")# 配置文件格式识别相关函数is.json.file(config.json)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
is.toml.file(config.toml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
is.ini.file(config.ini)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
is.yaml.file(config.yaml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(config.json)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "json"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(config.yaml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "yaml"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(config.ini)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "ini"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(config.toml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "toml"

配置文件读取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取配置文件中主键名称eval.config.sections(config.ini)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "default"            "comments"          ## [3] "extra_list_parse"   "other_config_parse"## [5] "rcmd_parse"         "bash_parse"        ## [7] "mulitple_parse"     "glue_parse"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eval.config.sections(config.toml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "bash_parse"         "comments"          ## [3] "default"            "extra_list_parse"  ## [5] "glue_parse"         "mulitple_parse"    ## [7] "other_config_parse" "title"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 读取配置文件生成R中的列表# 注意:可以直接传递fromJSON/read.ini/readLines/yaml.load相关参数给read.configread.config(file = config.toml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## List of 8##  $ bash_parse        :List of 2##   ..$ parsed: chr "bash"##   ..$ raw   : chr "#>#echo bash#<#"##  $ comments          :List of 1##   ..$ version: chr "0.2.3"##  $ default           :List of 1##   ..$ debug: chr "{{debug}} {{debug2}}"##  $ extra_list_parse  :List of 2##   ..$ parsed: chr "1"##   ..$ raw   : chr "{{yes}}"##  $ glue_parse        :List of 4##   ..$ parsed_1: chr [1:10] "1" "2" "3" "4" ...##   ..$ parsed_2: int [1:10] 1 2 3 4 5 6 7 8 9 10##   ..$ raw_1   : chr "!!glue {1:10}"##   ..$ raw_2   : chr "!!glue_numeric {1:10}"##  $ mulitple_parse    :List of 2##   ..$ parsed: chr "configr, configr, yes, 1, config, config, no, 0"##   ..$ raw   : chr "@>@str_replace('config','g$','gr')@<@, #>#echo configr#<#, {{key:yes_flag}}, {{yes}}, @>@str_replace('configr',"| __truncated__##  $ other_config_parse:List of 2##   ..$ parsed: chr "yes no"##   ..$ raw   : chr "{{key:yes_flag}} {{key:no_flag}}"##  $ title             : chr "TOML Example"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Get the same obj with config package, only get the 'default# or R_CONFIG_ACTIVE config sets' in config.cfg or# R_CONFIGFILE_ACTIVEeval.config(file = config.yaml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $debug## [1] "{{debug}} {{debug2}}"## ## attr(,"config")## [1] "default"## attr(,"configtype")## [1] "yaml"## attr(,"file")## [1] "/home/ljf/Rlibrary/configr/extdata/config.yaml"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Read designated sectioneval.config(file = config.json, config = "comments")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $version## [1] "0.2.3"## ## attr(,"config")## [1] "comments"## attr(,"configtype")## [1] "json"## attr(,"file")## [1] "/home/ljf/Rlibrary/configr/extdata/config.json"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Read designated section with its one valueeval.config(file = config.ini, config = "comments", value = "version")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "0.2.3"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# eval.config.merge 可以合并几个主键并减少配置文件的层数eval.config.merge(file = config.json, sections = c("default",   "comments"))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $debug## [1] "{{debug}} {{debug2}}"## ## $version## [1] "0.2.3"## ## attr(,"config")## [1] "default"  "comments"## attr(,"configtype")## [1] "json"## attr(,"file")## [1] "/home/ljf/Rlibrary/configr/extdata/config.json"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eval.config.merge(file = config.toml, sections = c("default",   "comments"))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $debug## [1] "{{debug}} {{debug2}}"## ## $version## [1] "0.2.3"## ## attr(,"config")## [1] "default"  "comments"## attr(,"configtype")## [1] "toml"## attr(,"file")## [1] "/home/ljf/Rlibrary/configr/extdata/config.toml"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# fetch.config可以导入http:// ftp://以及本地文件,# 它会将这些文件进行收集和读取,然后生成一个合并的R列表对象links <- c("https://raw.githubusercontent.com/JhuangLab/BioInstaller/master/inst/extdata/config/db/db_annovar.toml",   "https://raw.githubusercontent.com/JhuangLab/BioInstaller/master/inst/extdata/config/db/db_main.toml",   system.file("extdata", "config.toml", package = "configr"))x <- fetch.config(links)x[c(1:5, length(x))]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $db_annovar_1000g## $db_annovar_1000g$buildver_available## $db_annovar_1000g$buildver_available$`1000g`## [1] "hg18"## ## $db_annovar_1000g$buildver_available$`1000g2010`## [1] "hg18"## ## $db_annovar_1000g$buildver_available$`1000g2012apr`## [1] "hg19" "hg18"## ## $db_annovar_1000g$buildver_available$`1000g2012jul`## [1] "hg18"## ## $db_annovar_1000g$buildver_available$`1000g2014oct`## [1] "hg38" "hg19" "hg18"## ## $db_annovar_1000g$buildver_available$`1000g2015aug`## [1] "hg38" "hg19"## ## $db_annovar_1000g$buildver_available$other## [1] "hg19"## ## ## $db_annovar_1000g$description## [1] "alternative allele frequency data in 1000 Genomes Project"## ## $db_annovar_1000g$source_url## [1] "http://www.openbioinformatics.org/annovar/download/{{buildver}}_{{version}}.zip"## ## $db_annovar_1000g$version_available##  [1] "1000g2015aug" "1000g2014oct" "1000g2014sep"##  [4] "1000g2014aug" "1000g2012apr" "1000g2012feb"##  [7] "1000g2011may" "1000g2010nov" "1000g2012apr"## [10] "1000g2010jul" "1000g2010"    "1000g"       ## ## $db_annovar_1000g$version_newest## [1] "1000g2015aug"## ## ## $db_annovar_1000g_sqlite## $db_annovar_1000g_sqlite$buildver_available## [1] "hg19"## ## $db_annovar_1000g_sqlite$install## [1] "#R#for(i in c('all', 'afr', 'eas', 'eur', 'sas', 'amr')) {\\n  x <- set.1000g.db(sprintf('{{version}}_%s', i), '{{buildver}}', \\\"sql\\\");\\n  params <- list(sql.file = x, sqlite.path = str_replace(x, '.sql$', ''));\\n  do.call(sql2sqlite, params)\\n}\\n#R#"## ## $db_annovar_1000g_sqlite$source_url## [1] "http://bioinfo.rjh.com.cn/download/annovarR/humandb/{{buildver}}_{{version}}.tar.gz"## ## $db_annovar_1000g_sqlite$version_available## [1] "1000g2015aug"## ## $db_annovar_1000g_sqlite$version_newest## [1] "1000g2015aug"## ## ## $db_annovar_avsift## $db_annovar_avsift$buildver_available## [1] "hg19" "hg18"## ## $db_annovar_avsift$decompress## [1] TRUE TRUE## ## $db_annovar_avsift$description## [1] "whole-exome SIFT scores for non-synonymous variants (obselete and should not be uesd any more)"## ## $db_annovar_avsift$source_url## [1] "http://www.openbioinformatics.org/annovar/download/{{buildver}}_{{version}}.txt.gz"    ## [2] "http://www.openbioinformatics.org/annovar/download/{{buildver}}_{{version}}.txt.idx.gz"## ## $db_annovar_avsift$version_available## [1] "avsift"## ## $db_annovar_avsift$version_newest## [1] "avsift"## ## ## $db_annovar_avsnp## $db_annovar_avsnp$buildver_available## $db_annovar_avsnp$buildver_available$avsnp138## [1] "hg19"## ## $db_annovar_avsnp$buildver_available$avsnp142## [1] "hg38" "hg19"## ## $db_annovar_avsnp$buildver_available$avsnp144## [1] "hg38" "hg19"## ## $db_annovar_avsnp$buildver_available$avsnp147## [1] "hg38" "hg19"## ## $db_annovar_avsnp$buildver_available$avsnp150## [1] "hg38" "hg19"## ## ## $db_annovar_avsnp$decompress## [1] TRUE TRUE## ## $db_annovar_avsnp$description## $db_annovar_avsnp$description$avsnp138## [1] "dbSNP138 with allelic splitting and left-normalization"## ## $db_annovar_avsnp$description$avsnp142## [1] "dbSNP142 with allelic splitting and left-normalization"## ## $db_annovar_avsnp$description$avsnp144## [1] "dbSNP144 with allelic splitting and left-normalization (http://annovar.openbioinformatics.org/en/latest/articles/dbSNP/#additional-discussions)"## ## $db_annovar_avsnp$description$avsnp147## [1] "dbSNP147 with allelic splitting and left-normalization"## ## ## $db_annovar_avsnp$source_url## [1] "http://www.openbioinformatics.org/annovar/download/{{buildver}}_{{version}}.txt.gz"    ## [2] "http://www.openbioinformatics.org/annovar/download/{{buildver}}_{{version}}.txt.idx.gz"## ## $db_annovar_avsnp$version_available## [1] "avsnp150" "avsnp147" "avsnp144" "avsnp142" "avsnp138"## ## $db_annovar_avsnp$version_newest## [1] "avsnp150"## ## ## $db_annovar_avsnp_sqlite## $db_annovar_avsnp_sqlite$buildver_available## [1] "hg19"## ## $db_annovar_avsnp_sqlite$install## [1] "#R#sql2sqlite('{{buildver}}_{{version}}.sqlite.sql', sqlite.path = '{{buildver}}_{{version}}.sqlite')#R#"## ## $db_annovar_avsnp_sqlite$source_url## [1] "http://bioinfo.rjh.com.cn/download/annovarR/humandb/{{buildver}}_{{version}}.sqlite.sql.gz"## ## $db_annovar_avsnp_sqlite$version_available## [1] "avsnp147"        "avsnp147.common" "avsnp144"       ## [4] "avsnp142"        "avsnp138"       ## ## $db_annovar_avsnp_sqlite$version_newest## [1] "avsnp147"## ## ## $title## [1] "TOML Example"

配置文件格式转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Convert YAML configuration file to JSON formatout.json <- tempfile(fileext = ".json")convert.config(file = config.yaml, out.file = out.json, convert.to = "JSON")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(out.json)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "json"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Generate a JSON format configuration filelist.test <- list(a = c(123, 456))out.fn <- sprintf("%s/test.json", tempdir())write.config(config.dat = list.test, file.path = out.fn, write.type = "json")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(out.fn)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "json"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Generate a YAML format configuration file with defined# indentwrite.config(config.dat = list.test, file.path = out.fn, write.type = "yaml",   indent = 4)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] TRUE
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get.config.type(out.fn)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] "yaml"

配置文件扩展解析

为了最大化利用配置文件,我定义了一些规则来进行扩展解析,也就是在jsonlite/ini/yaml/RcppTOML读取配置文件之后进行额外的解析和操作。

  • extra.list可以用来替换配置文件中两个大括号括起来的值,比如 {{debug}}会被替换为 extra.list = list(debug = 'self')中的 self
  • other.config可以被用来联系两个配置文件,如果你设置 other.config =system.file('extdata', 'config.other.yaml', package='configr'),它会在config.other.yaml中读取 key并且获取 yes_flag的值然后替换解析的配置文件中对应的 {{key:yes_flag}}值。
  • rcmd.parse可以被用来解析 @>@str_replace('config','g$','gr')@<@,它可以将这一部分替换为R命令运行的结果。
  • bash.parse可以被用来解析 #>#echo bash#<#,它可以将这一部分替换为系统终端的命令运行结果.
  • glue.parse使用了R包glue进行相关解析,它会替换 !!glue {1:5}变为["1", "2", "3", "4", "5"]; !!glue_numeric {1:5}变为 [1, 2, 3, 4, 5]

下面是一些具体的实例供大家参考。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
other.config <- system.file("extdata", "config.other.yaml", package = "configr")read.config(file = other.config)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $key## $key$test_parse## [1] 123## ## $key$test_parse2## [1] 234## ## $key$yes_flag## [1] "yes"## ## $key$no_flag## [1] "no"## ## ## $`samtools@1.3.1`## $`samtools@1.3.1`$source_dir## [1] "/tmp"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config.1 <- read.config(file = config.json)config.1$default
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $debug## [1] "{{debug}} {{debug2}}"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
read.config(file = config.json, extra.list = list(debug = "self",   debug2 = "self2"))$default
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $debug## [1] "self self2"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sections <- c("default", "other_config_parse")config.1[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "{{debug}} {{debug2}}"## ## ## $other_config_parse## $other_config_parse$raw## [1] "{{key:yes_flag}} {{key:no_flag}}"## ## $other_config_parse$parsed## [1] "yes no"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
read.config(file = config.json, extra.list = list(debug = "self",   debug2 = "self2"), other.config = other.config)[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "self self2"## ## ## $other_config_parse## $other_config_parse$raw## [1] "yes no"## ## $other_config_parse$parsed## [1] "yes no"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sections <- c("default", "other_config_parse", "rcmd_parse")# The followed two line command will return the same valueconfig.1[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "{{debug}} {{debug2}}"## ## ## $other_config_parse## $other_config_parse$raw## [1] "{{key:yes_flag}} {{key:no_flag}}"## ## $other_config_parse$parsed## [1] "yes no"## ## ## $rcmd_parse## $rcmd_parse$raw## [1] "@>@ Sys.Date() @<@"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
read.config(file = config.json, extra.list = list(debug = "self",   debug2 = "self2"), other.config = other.config, rcmd.parse = T)[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "self self2"## ## ## $other_config_parse## $other_config_parse$raw## [1] "yes no"## ## $other_config_parse$parsed## [1] "yes no"## ## ## $rcmd_parse## $rcmd_parse$raw## [1] "2017-11-26"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parse.extra(config.1, extra.list = list(debug = "self", debug2 = "self2"),   other.config = other.config, rcmd.parse = T)[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "self self2"## ## ## $other_config_parse## $other_config_parse$raw## [1] "yes no"## ## $other_config_parse$parsed## [1] "yes no"## ## ## $rcmd_parse## $rcmd_parse$raw## [1] "2017-11-26"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sections <- c("default", "other_config_parse", "rcmd_parse",   "mulitple_parse")config.1[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "{{debug}} {{debug2}}"## ## ## $other_config_parse## $other_config_parse$raw## [1] "{{key:yes_flag}} {{key:no_flag}}"## ## $other_config_parse$parsed## [1] "yes no"## ## ## $rcmd_parse## $rcmd_parse$raw## [1] "@>@ Sys.Date() @<@"## ## ## $mulitple_parse## $mulitple_parse$raw## [1] "@>@str_replace('config','g$','gr')@<@, #>#echo configr#<#, {{key:yes_flag}}, {{yes}}, @>@str_replace('configr','r','')@<@, #># echo config#<#, {{key:no_flag}}, {{no}}"## ## $mulitple_parse$parsed## [1] "configr, configr, yes, 1, config, config, no, 0"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parse.extra(config.1, extra.list = list(debug = "self", debug2 = "self2",   yes = "1", no = "0"), other.config = other.config, rcmd.parse = T,   bash.parse = F)[sections]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $default## $default$debug## [1] "self self2"## ## ## $other_config_parse## $other_config_parse$raw## [1] "yes no"## ## $other_config_parse$parsed## [1] "yes no"## ## ## $rcmd_parse## $rcmd_parse$raw## [1] "2017-11-26"## ## ## $mulitple_parse## $mulitple_parse$raw## [1] "configr, #>#echo configr#<#, yes, 1, config, #># echo config#<#, no, 0"## ## $mulitple_parse$parsed## [1] "configr, configr, yes, 1, config, config, no, 0"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# glue parseraw <- c("a", "!!glue{1:5}", "c")list.raw <- list(glue = raw, nochange = 1:10)list.raw
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $glue## [1] "a"           "!!glue{1:5}" "c"          ## ## $nochange##  [1]  1  2  3  4  5  6  7  8  9 10
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expect.parsed.1 <- c("a", "1", "2", "3", "4", "5", "c")expect.parsed.2 <- list(glue = expect.parsed.1, nochange = 1:10)parse.extra(list.raw, glue.parse = TRUE, glue.flag = "!!glue")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $glue## [1] "a" "1" "2" "3" "4" "5" "c"## ## $nochange##  [1]  1  2  3  4  5  6  7  8  9 10
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自动化-Httprunner3源码阅读-Ongoing
我现在的公司目前使用的自动化测试框架为Httprunner3 , 框架本身完备度较高, 但是在实际使用过程中发现一个bug:
打铁读书郎
2024/04/11
1280
DevopsCamp 第一期作业: 《cobra - 02 配置文件的读取与保存(简单)》 解题答案
本文为 DevOpsCamp 实战训练作业 cobra - 02 配置文件的读取与写入(简单) 的解题答案
老麦
2023/02/25
3670
DevopsCamp 第一期作业: 《cobra - 02 配置文件的读取与保存(简单)》 解题答案
最全总结 | 聊聊 Python 数据处理全家桶(配置篇)
常用配件文件的处理方式,包含:JSON、ini / config、YAML、XML 等
AirPython
2020/10/23
1.1K0
最全总结 | 聊聊 Python 数据处理全家桶(配置篇)
python 配置文件读写
将代码中的配置项抽取到配置文件中,修改配置时不需要涉及到代码修改,避免面对一堆令人抓狂的 magic number,极大的方便后期软件的维护。
orientlu
2018/09/13
1.9K0
SaltStack命令大全
master端: #yum install salt-master -y                         salt主控端安装 # vim /etc/salt/master                                salt主配置文件修改 interface: 服务监听IP auto_accept: True(可选,key通过‘salt-key -a keyname’命令手动进行认证) 注意:keyname 就是客户端中设置的id标识(可以查看salt-minion端的配置)
菲宇
2022/12/02
1.9K0
【redis源码学习】redis启动并读取配置文件的过程
这不我的毕设马上要用到开机配置文件了嘛,但是没有什么太好的想法,于是就想着学学redis是如何实现这个过程的,学完马上就能学以致用了。
看、未来
2021/12/27
9420
「Workshop」第四十二期 R文件读写
rio是一个比较简单,但是又非常强大的一个数据读写包,这个包的特点是:根据文件的拓展名推断文件的类型,然后调用不同的包来读写数据,目前支持的文件类型
王诗翔呀
2021/04/23
9030
logstash的各个场景应用(配置文件均已实践过)
1) datasource->logstash->elasticsearch->kibana
Jetpropelledsnake21
2019/05/19
4K0
SpringBoot配置文件的12个实用技巧
配置文件是SpringBoot应用的核心组成部分,它决定了应用的行为、连接参数以及功能特性。
每周聚焦
2025/05/19
2000
SpringBoot配置文件的12个实用技巧
Go(三)Go配置文件
熟悉使用SpringBoot的同学,再去使用Go之后,就会发现SpringBoot的配置文件是真的很方便
lomtom
2021/10/27
1.4K0
探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器
因为 nanoserver 使用了 xorm,它会自动的根据定义的 model 生成数据库表 schema。
为少
2021/05/27
1.6K0
探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器
前端打包工具Mako架构解析|得物技术
Mako是一个新的Web打包工具,适用于Web应用、库和框架。它被设计得快速、可靠且易于使用。Mako已被数百个生产项目中使用。如果你正在寻找一个现代的Web打包工具,Mako是正确的选择。
得物技术
2024/07/16
3120
前端打包工具Mako架构解析|得物技术
从新手到专家:如何用Python编写配置文件
设计软件时,我们通常要花费很多精力编写高质量代码。但这还不够,一个好的软件还应关注它的生态系统,例如测试,部署,网络等,这其中最重要的一方面就是配置管理。
程序员小强
2021/04/14
7.4K0
Golang生态:使用viper管理配置
通过配置,我们可以动态地改变程序的行为,常用的方式包括配置文件,命令行参数,环境变量等。我原来一直很欣赏ssh的配置管理方式:
王录华
2019/11/19
5.1K1
Go语言微服务框架 - 2.实现加载静态配置文件
首先,我们要正确地认识到配置文件的重要性:在程序交付后,变更代码的成本很大;相对而言,变更配置文件的成本就比较小。但有的同学又走了另一个极端,也就是将大量的逻辑放入到配置文件中,导致配置文件膨胀,本质上就是将部分本应在代码中维护的内容转移到了配置文件,导致配置文件也很难维护。
junedayday
2021/09/24
1.4K0
Python接口自动化之yaml配置文件
在上一篇Python接口自动化测试系列文章:Python接口自动化之数据驱动,主要介绍openpyxl操作excel,结合ddt实现数据驱动。
可可的测试小栈
2020/05/07
7.9K0
【Go API 开发实战 6】基础 2:配置文件读取
从上面这些特性来看,Viper 毫无疑问是非常强大的,而且 Viper 用起来也很方便,在初始化配置文件后,读取配置只需要调用viper.GetString()、viper.GetInt() 和 viper.GetBool()等函数即可。
腾讯技术工程官方号
2019/05/16
2.2K0
【Go API 开发实战 6】基础 2:配置文件读取
GATK Germline_SNP_INDEL_2.0 分析遗传病(耳聋)
备注:docker运行的操作系统,推荐为Linux,windows,macOS系统改下docker可能部分功能(网络)不能正常运行
SliverWorkspace
2022/12/12
8700
GATK Germline_SNP_INDEL_2.0 分析遗传病(耳聋)
Go几种读取配置文件的方式
如果只希望绑定特定的,可以使用SetEnvPrefix("global.source", "MYAPP_GLOAL_SOURCE"),注意这个函数不会自动加上MYAPP的前缀.
fliter
2023/09/07
8960
Go几种读取配置文件的方式
Python常用配置文件ini、json、yaml读写总结
ini 即 Initialize ,是Windows中常用的配置文件格式,结构比较简单,主要由节(Section)、键(key)和值(value)组成。每个独立部分称之为section,每个section内,都是key(option)=value形成的键值对。
吾非同
2020/12/17
2.7K0
推荐阅读
相关推荐
自动化-Httprunner3源码阅读-Ongoing
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档