baptiste auguie wrote:
Dear all,


I wrote a wrapper to a FORTRAN program using R. The main program uses a text file (~200 lines) as an input describing the simulation to be run. I typically generate the file once with the right parameters using a combination of file(), paste(), cat(). This is fine, and it works well, however I then need to update only a few values in the file many times (~200 times, typically). I've used Ruby for this task in the past, and I wonder whether there is a simple and efficient way to achieve this in R.

Here's a minimal example,


myFile <- "test.txt"
writeHeader <-
function (out=myFile, N=5, wavelength=0.1)
{
     output <- file(paste(out), "w")
headerString <- c("Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Variables", wavelength, N, "

- wavelength
- ind_refMed

Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
")
     cat(paste(headerString), file = output, sep = "\n")

     close(output)
}

writeHeader(out=myFile)

system(paste("cat", myFile))

system.time(sapply(1:200, writeHeader) -> b.quiet)


Now for the ruby replacement solution:

#!/usr/bin/ruby -w
lambda = 0.1
N = 5

input_file=IO.readlines('test.txt')
# replace wavelength
input_file[6]= lambda.to_f
input_file[7]= N.to_f
f=File.new("test2.txt","w")
f.puts input_file
f.close

I think (unverified) that this approach is more efficient than calling the writeHeader() each time. Please do let me know if I'm wrong on this. The drawback of using this Ruby script is that I need to know the numbers of the lines to be replaced (also, I don't know much in Ruby). I'm not sure how I can find this other than manually, as there is no regular pattern to look for. Ideally the generating script writeHeader() would return these line numbers, I'm not sure how to achieve this.

Any comments are welcome.

If there are only 200 lines, why not put them into a character vector, and edit them there? That's more or less what your Ruby code does. In R, it would be written

input_file <- readLines("test.txt")
input_file[6] <- sprintf("%f", lambda)
input_file[7] <- sprintf("%f", N)
writeLines("test2.txt", input_file)

but if everything is in R, you don't need the first line.

Duncan Murdoch

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to