[R] Scan and Lists

Martin Maechler maechler at stat.math.ethz.ch
Thu Sep 15 10:19:05 CEST 2005

>>>>> "Michael" == Michael Lefsky <lefsky at gmail.com>
>>>>>     on Wed, 14 Sep 2005 15:06:17 -0600 writes:

    Michael> This may be a newbie question - although I did
    Michael> search for this error message in the archives and
    Michael> via google and didn't see this error:

I know how useful google can be - - still, sometimes one would
better spend the time differently ... You know the old IBM
motto? If not, google for "IBM motto"  ;-)

    Michael> The help page for "scan" indicates that among the types of data
    Michael> capable of being read are:

    >> "The supported types are 'logical', 'integer', 'numeric',
    >> 'complex', 'character', 'raw' and 'list': 'list' values
    >> should have elements which are one of the first six types
    >> listed or 'NULL'.

    Michael> I have tried to use a list within a "what" list : 

which was wrong:

    Michael> f <- scan(file="c:/test/testout.csv",
    Michael>           what=list(hi=0.0,bye="",wave=list(1:1000)),
    Michael>           sep=",",skip=1)
    Michael> and the following error is returned: 

    Michael> "c:/test/testout.csv", what = list(hi = 0, bye = "",  : 
    Michael> unimplemented type 'list' in 'extractItem'

    Michael> So, is my syntax confusing R, or is the documentation wrong, or is it
    Michael> some other, third, option?

3rd: You didn't read the documentation carefully enough
    (though I agree that the current wording leaves a non-small
     possibility for confusion):

In your above citation from the help page, you've left off
crucial context. Here is a bit more

 >> what: the type of 'what' gives the type of data to be read. If
 >>        'what' is a list, it is assumed that the lines of the data
 >>        file are records each containing 'length(what)' items
 >>        ("fields"). The supported types are 'logical', 'integer',
 >>        'numeric', 'complex', 'character', 'raw' and 'list': 'list'
 >>        values should have elements which are one of the first six
 >>        types listed or 'NULL'.

So 'what' has a *type* and that type can be logical, ...., and list.
where list should have elements from the first six types ---
which do *NOT* include list.

In short: It does exclude using a *list* inside the list.

Is your data
     <double> <character> <int> <int> .... <int>
with 1000 integers, i.e. you have 1002 columns?

If yes, you'd probably get what you want by

    whatCols <- c(list(hi=0.0, bye=""), as.list(1:1000))
    f <- scan(file = "c:/test/testout.csv",
              what = whatCols, sep= ",", skip=1)

{The point here is that c(l1, l2) is used to concatenate two
 lists l1 and l2;
 and yes: Please do use spaces {and indentation} to make your
	  more readable !

    Michael> Thanks

You're welcome,
Martin Maechler, ETH Zurich

More information about the R-help mailing list