[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
> for (x in l) and lapply(l, function(x) print(x)). Please help.
>
--
Sarah Goslee
http://www.functionaldiversity.org
More information about the R-help
mailing list