2017-05-15 5 views
0

Je souhaite écrire un code logiciel qui modifiera les valeurs des paramètres requis de mon fichier txt d'entrée de modèle hydrologique. certains paramètres sont fixes et certains je vais changer aux valeurs observées. Par exemple HYDRUS_Version = 4 est fixé et WaterFlow = 1 et SoluteTransport = 0 etc sont les paramètres que je veux changer leurs valeurs. Je veux assigner les valeurs de waterFlow = 5 ou WaterFlow = 3.1 et SoluteTransport = 2 ou = 2.2Modification des valeurs dans le fichier txt à l'aide de R

J'ai essayé ce code pour l'écoulement d'eau mais les valeurs dans mes dossiers de txt ne sont pas changées. Je suis tout nouvel apprenant de 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]) 

Voici le dossier complet 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

je tentais de mettre juste le dossier complet comme une écriture normale mais accepté en format de code. –

Répondre

0

Créer une fonction personnalisée à chaîne correspondant à rechercher et remplacer la valeur:

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" 

Données d'entrée:

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

C'est selon ma question. Prof maintenant assigné une nouvelle manière. Je vais mettre une autre question. Merci d'avoir écrit ça. C'est bon. Mais maintenant le problème est que nous ne changerons pas les valeurs ici dans le code manuellement, comme vous l'avez fait. nous avons un fichier texte où nous avons des valeurs de paramètres. il va lire les valeurs de ce fichier txt et l'assigner ici. Peux-tu faire ça? Je l'ai également fait avec la fonction de remplacement. le code est sur mon ordinateur de laboratoire. Je vais télécharger demain. mais il a dit que nous avons la valeur WaterFlow et tous les autres paramètres dans le fichier texte, puis il va le lire. aussi, créez ce fichier texte en R. –

+0

peut-être que mon anglais n'est pas bon. dat <- replaceFn ("WaterFlow", 3.1, dat) nous ne pouvons pas le faire de cette façon. il va lire la valeur de 3.1 à partir d'un fichier texte et ce fichier texte, nous allons également créer. merci pour l'aide. –

+0

Son code, votre code et le mien ont besoin d'une saisie manuelle. nous avons besoin d'un code qui lira les valeurs de ces variables à partir d'un autre fichier texte. Ces fichiers texte ont des lignes différentes et nous lui donnons juste la commande et il va lire la ligne spécifique et assigner les valeurs de ces lignes. tx <- gsub (motif = "Unsatchem = 1", remplacer = "Unsatchem = 1", x = tx) tx <- gsub (motif = "HP1 = 0", remplacer = "HP1 = 2", x = tx tx <- gsub (motif = "PrintTimes = 170", remplacer = "PrintTimes = 3000", x = tx) writeLines (tx1, "G: /Rlearning/HYDRUS1D_1.txt") –