Skip to content
Back to formatted view

Raw Message

Message-ID: <efb536d50902111145q3e850821ifd83c151100dcd8f@mail.gmail.com>
Date: 2009-02-11T19:45:03Z
From: Sarah Goslee
Subject: What is going on?
In-Reply-To: <d3a045300902111118u20ad5935j7b793f569de03e24@mail.gmail.com>

Lists. You're missing the "list" concept. I'm sure others can explain it
better, but here's the basic idea.

Take a look at l after you do the split:
> l
[[1]]
[1] "1" "2"
> length(l)
[1] 1

strsplit() returns a list of length 1, with two elements, the two
split "bits" of your initial string. The help for strsplit() even says:

   A list of length 'length(x)' the 'i'-th element of which contains
     the vector of splits of 'x[i]'.

You can get the individual components that you expected with
l[[1]][1]
and
l[[1]][2]

This is confusing in the single case, but allows strsplit to work on multiple
strings:

> s <- c("1,2", "3,4")
> l = strsplit(s, ",", fixed=TRUE)
> l
[[1]]
[1] "1" "2"

[[2]]
[1] "3" "4"

> l[[1]][1]
[1] "1"
> l[[2]][1]
[1] "3"
> length(l)
[1] 2

On Wed, Feb 11, 2009 at 2:18 PM, Paul Johnston <pcj127 at gmail.com> wrote:
> Ok, so I'm new to R, but this is driving me crazy.  In this example, I
> am trying to process each element in a list.
>
> <code>
> s = "1,2"
> l = strsplit(s, ",", fixed=TRUE)
> print("BEGIN")
> n = length(l)
> i = 1
> while (i <= n) {
>  x = l[[i]]
>  print(paste("x:", class(x), x))
>  print("BEFORE PRINT")
>  print(x)
>  print("AFTER PRINT")
>  i = i + 1
> }
> </code>
>
> <actual output>
>     [exec] [1] "BEGIN"
>     [exec] [1] "x: character 1" "x: character 2"
>     [exec] [1] "BEFORE PRINT"
>     [exec] [1] "1" "2"
>     [exec] [1] "AFTER PRINT"
>     [exec] [1] "END"
>     [exec] [1] TRUE
> </actual output>
>
> <expected output>
>     [exec] [1] "BEGIN"
>     [exec] [1] "x: character 1"
>     [exec] [1] "BEFORE PRINT"
>     [exec] [1] "1"
>     [exec] [1] "AFTER PRINT"
>     [exec] [1] "x: character 2"
>     [exec] [1] "BEFORE PRINT"
>     [exec] [1] "2"
>     [exec] [1] "AFTER PRINT"
>     [exec] [1] "END"
>     [exec] [1] TRUE
> </expected output>
>
> What *basic* concept am I missing here?  The same thing happens with
> for (x in l) and lapply(l, function(x) print(x)). Please help.
>

-- 
Sarah Goslee
http://www.functionaldiversity.org