[R] scan or source a text file into a list

Roger Bivand Roger.Bivand at nhh.no
Thu Nov 11 18:31:19 CET 2004


On Thu, 11 Nov 2004, Andy Bunn wrote:

> I've ported somebody else's rather cumbersome Matlab model to R for
> colleagues that want a free build of the model with the same type of I/O.
> 
> The Matlab model reads a text file with the initial parameters specified as:

I think I would be tempted to try out read.dcf() for this, which returns a 
character matrix of field values in named columns, from which values cast 
to numeric:

> system("cat tmp/Params.dcf")
nYears: 50
year0: 1970
fnr: 0.30
qe: 0.040
> x <- read.dcf("tmp/Params.dcf")
> x
     nYears year0  fnr    qe     
[1,] "50"   "1970" "0.30" "0.040"
> str(x)
 chr [1, 1:4] "50" "1970" "0.30" "0.040"
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "nYears" "year0" "fnr" "qe"


Since you will know the mode you need, you could read the same-mode fields 
together and cast them:

> x <- read.dcf("tmp/Params.dcf", fields=c("nYears", "year0"))
> mode(x) <- "integer"
> x
     nYears year0
[1,]     50  1970

and make x a data frame if say x$nYears is needed, which gets to list:

> as.list(data.frame(x))
$nYears
[1] 50

$year0
[1] 1970

and c() of the different mode lists to make inputParamList. I think 
treating everything as numeric may be enough, and the DCF format is 
flexible.

Roger

> 
> C:\Data\Carluc\Rport>more Params.R
> # Number of years to simulate
> nYears = 50;
> # Initial year for graphing purposes
> year0 = 1970;
> # NPP/GPP ratio (cpp0 unitless)
> fnr = 0.30;
> # Quantum efficency
> qe  = 0.040;
> 
> That is, there are four input variables (for this run - there can be many
> more) written in a way that R can understand them. In R, I can have the
> model source the parameter text file easily enough and have the objects in
> the workspace. The model function in R takes a list at runtime. How can I
> have R read that file and put the contents into the list I need?
> 
> E.g.,
> > rm(list = ls())
> > source("Params.R")
> > ls()
> [1] "fnr"    "nYears" "qe"     "year0"
> > fnr
> [1] 0.3
> > nYears
> [1] 50
> > foo.list <- list(fnr = fnr, nYears = nYears)
> >
> > foo.list
> $fnr
> [1] 0.3
> 
> $nYears
> [1] 50
> 
> 
> The model is then run with
> > CarlucR(inputParamList = foo.list, ...)
> 
> I can't build inputParamList "by hand" as above because the number of
> initial parameters changes with the model run and this runs in a wrapper.
> 
> Any thoughts? Some combination of paste with scan or parse?
> -Andy
> 
> 
> > version
>          _
> platform i386-pc-mingw32
> arch     i386
> os       mingw32
> system   i386, mingw32
> status
> major    2
> minor    0.0
> year     2004
> month    10
> day      04
> language R
> >
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
> 

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Breiviksveien 40, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 93 93
e-mail: Roger.Bivand at nhh.no




More information about the R-help mailing list