2017-05-15 22 views
0

我想写一个软编码,它将更改我的水文模型输入txt文件所需参数的值。一些参数是固定的,有些我会改变为观察值。对于试验,HYDRUS_Version = 4是固定的,WaterFlow = 1和SoluteTransport = 0等是我想改变它们的值的参数。我想分配waterFlow = 5或WaterFlow = 3.1和SoluteTransport = 2或= 2.2的值使用R更改txt文件中的值

我试过这个代码,但我的txt文件中的值没有改变。我只是R的新学习者。

lines <- readLines("G:/Rlearning/HYDRUS1D.txt") 

     library(gsubfn) 
     i1 <- grepl("Vertical Conductivity", lines) 
     lines[i1] <- gsubfn("[0-9.]+", ~format(as.numeric(x)*2, 
              scientific = FALSE), lines[i1]) 

下面是完整的txt文件。

; 
[Main] 
HYDRUS_Version=4 
WaterFlow=1 
SoluteTransport=0 
Unsatchem=0 
Unsatchem=0 
HP1=0 
HeatTransport=0 
EquilibriumAdsorption=1 
MobileImmobile=0 
RootWaterUptake=1 
RootGrowth=0 
MaterialNumbers=1 
SubregionNumbers=1 
SpaceUnit=cm 
TimeUnit=days 
PrintTimes=160 
NumberOfSolutes=0 
InitialCondition=1 
; 
[Profile] 
NumberOfNodes=101 
ProfileDepth=1.2E+02 
ObservationNodes=5 
GridVisible=1 
SnapToGrid=1 
ProfileWidth=80 
LeftMargin=40 
GridOrgX=0 
GridOrgY=0 
GridDX=5.E+00 
GridDY=5.E+00 
+0

我试图只是把整个文件作为一个正常的写作,但它以代码格式接受。 –

回答

0

创建一个自定义函数来搜索匹配的字符串和替换值:

replaceFn <- function(phrase, value, file){ 
    line <- file[grep(phrase, file)] 
    value.pos <- as.numeric(gregexpr("=", line)) 
    file[grep(phrase, file)] <- paste0(substring(line, 1, value.pos), value) 
    return(file) 
} 


dat <- replaceFn("WaterFlow", 3.1, dat) 
dat <- replaceFn("SoluteTransport", 2.2, dat) 

[1] ";"      "[Main]"     "HYDRUS_Version=4"  "WaterFlow=3.1"   "SoluteTransport=2.2"  "Unsatchem=0"    
[7] "Unsatchem=0"    "HP1=0"     "HeatTransport=0"   "EquilibriumAdsorption=1" "MobileImmobile=0"  "RootWaterUptake=1"  
[13] "RootGrowth=0"   "MaterialNumbers=1"  "SubregionNumbers=1"  "SpaceUnit=cm"   "TimeUnit=days"   "PrintTimes=160"   
[19] "NumberOfSolutes=0"  "InitialCondition=1"  ";"      "[Profile]"    "NumberOfNodes=101"  "ProfileDepth=1.2E+02" 
[25] "ObservationNodes=5"  "GridVisible=1"   "SnapToGrid=1"   "ProfileWidth=80"   "LeftMargin=40"   "GridOrgX=0"    
[31] "GridOrgY=0"    "GridDX=5.E+00"   "GridDY=5.E+00" 

输入数据:

dat <- c(";", "[Main]", "HYDRUS_Version=4", "WaterFlow=1", "SoluteTransport=0", 
"Unsatchem=0", "Unsatchem=0", "HP1=0", "HeatTransport=0", "EquilibriumAdsorption=1", 
"MobileImmobile=0", "RootWaterUptake=1", "RootGrowth=0", "MaterialNumbers=1", 
"SubregionNumbers=1", "SpaceUnit=cm", "TimeUnit=days", "PrintTimes=160", 
"NumberOfSolutes=0", "InitialCondition=1", ";", "[Profile]", 
"NumberOfNodes=101", "ProfileDepth=1.2E+02", "ObservationNodes=5", 
"GridVisible=1", "SnapToGrid=1", "ProfileWidth=80", "LeftMargin=40", 
"GridOrgX=0", "GridOrgY=0", "GridDX=5.E+00", "GridDY=5.E+00") 
+0

这是根据我的问题。教授现在分配了一种新的方式。我会提出另一个问题。 thnx写这个。这很好。但现在问题是我们不会像手动那样在代码中手动更改这些值。我们有一个文本文件,我们有参数值。它会从这个txt文件读取值并在这里分配它。你能做到吗?我也做了替换功能。代码在我的实验室电脑上。我明天就会上传。但他说我们在文本文件中有WaterFlow值和所有其他参数,然后它会读取它。另外,在R中创建该文本文件。 –

+0

也许我的英文不好。 dat < - replaceFn(“WaterFlow”,3.1,dat)我们不能这样做。它会从一个文本文件读取3.1的值,我们也将创建这个文本文件。 thnx的帮助。 –

+0

其我的代码,你的和我的代码需要手动输入。我们需要一个软代码,它将从另一个文本文件中读取这些变量的值。这个文本文件有不同的行,我们只给他一个命令,它将读取特定的行并为这些行分配值。 tx < - gsub(pattern =“Unsatchem = 1”,replace =“Unsatchem = 1”,x = tx) tx <-gsub(pattern =“HP1 = 0”,replace =“HP1 = 2”,x = tx ) tx < - gsub(pattern =“PrintTimes = 170”,replace =“PrintTimes = 3000”,x = tx) writeLines(tx1,“G:/Rlearning/HYDRUS1D_1.txt”) –