# [R] What is going on?

Sarah Goslee sarah.goslee at gmail.com
Wed Feb 11 20:45:03 CET 2009

```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