繁体   English   中英

如何在 R 中的文件中写入或更改某些字符?

[英]How can I write or change some characters in my file in R?

我有一个 PRM 文件,它是一种文本文件。 我想更改其中的一些字符。 例如,“ md = minf; ”到“ md = maxf ;” 和“ ls = 1 ”到“ ls = 3 ”。 你能指导我如何改变它吗? 我不知道在这种情况下如何使用 WriteLines 函数?

> setwd("C:/Users/Documents/CONN")
> fileName <- "Hmin.PRM"
> conn <- file(fileName,open="r")
> linn <-readLines(conn)
> for (i in 1:length(linn)){
+   print(linn[i])
+ }
[1] ""
[1] "begin_pop = \"p1\";"
[1] "   beginfounder;"
[1] "      male   [n =   20, pop = \"hp\"];"
[1] "      female [n = 400, pop = \"hp\"];"
[1] "   endfounder;"
[1] "   ls  = 1;           "
[1] "   pmp = 0.5;                 "
[1] "   ng  = 10;                  "
[1] "   md  = minf;                 "
[1] "   sr  = 0.5;                 "
[1] "   dr  = 0.3;                 "
[1] "   sd  = ebv /h;             "
[1] "   cd  = ebv /l;              "
[1] "   ebvest = true_av;"
[1] "   begpop;"
[1] "        ld /maft 0.1;"
[1] "\t   crossover;"
[1] "        data;"
[1] "        stat;"
[1] "        genotype/gen 8 9 10;"
[1] "   endpop;"
[1] "end_pop;"
[1] "  "
> close(conn)
linn <- c("begin_pop = \\p1\\;", "   beginfounder;", "      male   [n =   20, pop = \\hp\\];", "      female [n = 400, pop = \\hp\\];", "   endfounder;", "   ls  = 1;", "   pmp = 0.5;", "   ng  = 10;", "   md  = minf;", "   sr  = 0.5;", "   dr  = 0.3;", "   sd  = ebv /h;", "   cd  = ebv /l;", "   ebvest = true_av;", "   begpop;", "        ld /maft 0.1;", "\t   crossover;", "        data;", "        stat;", "        genotype/gen 8 9 10;", "   endpop;", "end_pop;")

gsub("\\b(ls\\s*=\\s*)1", "\\1 3",
     gsub("\\b(md\\s*=\\s*)minf", "\\1maxf", linn))
#  [1] "begin_pop = \\p1\\;"                    "   beginfounder;"                      
#  [3] "      male   [n =   20, pop = \\hp\\];" "      female [n = 400, pop = \\hp\\];" 
#  [5] "   endfounder;"                         "   ls  =  3;"                          
#  [7] "   pmp = 0.5;"                          "   ng  = 10;"                          
#  [9] "   md  = maxf;"                         "   sr  = 0.5;"                         
# [11] "   dr  = 0.3;"                          "   sd  = ebv /h;"                      
# [13] "   cd  = ebv /l;"                       "   ebvest = true_av;"                  
# [15] "   begpop;"                             "        ld /maft 0.1;"                 
# [17] "\t   crossover;"                         "        data;"                         
# [19] "        stat;"                          "        genotype/gen 8 9 10;"          
# [21] "   endpop;"                             "end_pop;"                              

正则表达式的解释:

  • \\b是一个词边界,所以我们匹配md但不匹配amd
  • \\s*是零个或多个空格
  • (..)是一个匹配组,(在这种情况下)我们希望将其带回替换;
  • \\1正在调用第一个匹配组
  • 我在ls =3之间引入了一个空格(而我没有在maxf之前添加一个空格)的唯一原因是我希望\\1\\13之间在视觉上绝对没有歧义,这意味着 13 个匹配组。 R 对后者没有问题,但我想我会在正则表达式中保持清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM