[R] Looking for simple line-splitting code
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Wed Feb 5 23:38:48 CET 2025
Hello,
Inline.
Às 20:27 de 05/02/2025, peter dalgaard escreveu:
> A 3rd option could be
>
> scan(text=x, what="", blank.lines.skip=FALSE)
>
> (all because readLines() doesn't obey the text=x convention, perhaps it should? I'm unsure whether the textConnection is left open in Rui's method.)
No, it is not left open. Use ?showConnections to check it.
x <- c("abc\ndef", "", "ghi")
x |> textConnection() |> readLines()
showConnections()
# this creates and opens a connection
tc <- textConnection(x)
showConnections()
readLines(tc)
showConnections()
close(tc)
showConnections()
Hope this helps,
Rui Barradas
>
> -pd
>
>> On 5 Feb 2025, at 15:35 , Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> Thanks to Rui, Peter and Tanvir! Peter's seems to be the fastest of the 3 suggestions so far on the little test case, but on the real data (where x contains several thousand lines), Rui's seems best.
>>
>> Duncan
>>
>> On 2025-02-05 9:13 a.m., peter dalgaard wrote:
>>> This also seems to work:
>>>> strsplit(paste(x,collapse="\n"),"\n")[[1]]
>>> [1] "abc" "def" "" "ghi"
>>>> On 5 Feb 2025, at 14:44 , Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>>>
>>>> If I have this object:
>>>>
>>>> x <- c("abc\ndef", "", "ghi")
>>>>
>>>> and I write it to a file using `writeLines(x, "test.txt")`, my text editor sees a 5 line file:
>>>>
>>>> 1: abc
>>>> 2: def
>>>> 3:
>>>> 4: ghi
>>>> 5:
>>>>
>>>> which is what I'd expect: the last line in the editor is empty. If I use `readLines("test.txt")` on that file, I get the vector
>>>>
>>>> c("abc", "def", "", "ghi")
>>>>
>>>> and all of that is fine.
>>>>
>>>> What I'm looking for is simple code that modifies x to the `readLines()` output, without actually writing and reading it.
>>>>
>>>> My first attempt doesn't work:
>>>>
>>>> unlist(strsplit(x, "\n"))
>>>>
>>>> because it leaves out the blank line 3. I can fix that with this ugly code:
>>>>
>>>> lines <- strsplit(x, "\n")
>>>> lines[sapply(lines, length) == 0] <- list("")
>>>> lines <- unlist(lines)
>>>>
>>>> Surely there's a simpler way to do this? I'd like to use just base functions, no other packages.
>>>>
>>>> Duncan Murdoch
>>>>
>>>> ______________________________________________
>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>
>
--
Este e-mail foi analisado pelo software antivírus AVG para verificar a presença de vírus.
www.avg.com
More information about the R-help
mailing list