What is going on?
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