我有一個 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)
uj5u.com熱心網友回復:
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 =我在and之間引入一個空格3(而我之前沒有添加空格maxf)的唯一原因是我希望在視覺上絕對沒有歧義,\\1并\\13建議 13 個匹配組。R 對后者沒有問題,但我想我會在正則運算式中保持清楚。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/435677.html
