[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