Making R’s paste act more like CONCAT

October 31, 2011
By

[This article was first published on Jermdemo Raised to the Law, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

While vector-friendly, R’s paste function has a few behaviors I don’t particularly like.

One is using a space as the default separator:


> adjectives<-c("lean","fast","strong")
> paste(adjectives,"er")
> paste(adjectives,"er")
[1] "lean er" "fast er" "strong er" #d'oh
> paste(adjectives,"er",sep="")
[1] "leaner" "faster" "stronger"

Empty vectors get an undeserved first class treatment:


> paste(indelPositions,"i",sep="")
[1] "i"
> indelPositions<-c(5,6,7)
> paste(indelPositions,"i",sep="")
[1] "5i" "6i" "7i" #good

> indelPositions<-c()
> paste(indelPositions,"i",sep="")
[1] "i" #not so good

And perhaps worst of all, NA values get replaced with a string called “NA”:


> placing<-"1"
> paste(placing,"st",sep="")
[1] "1st" #awesome

> placing<-NA_integer_
> paste(placing,"st",sep="")
[1] "NAst" #ugh

This is inconvenient in situations where I don’t know a priori if I will get a value, a vector of length 0, or an NA.

Working from Hadley Wickham’s str_c function in the stringr package, I decided to write a paste function that behaves more like CONCAT in SQL:


library(stringr)
concat<-CONCAT<-function(...,sep="",collapse=NULL){
strings<-list(...)
#catch NULLs, NAs
if(
all(unlist(llply(strings,length))>0)
&&
all(!is.na(unlist(strings)))
){
do.call("paste", c(strings, list(sep = sep, collapse = collapse)))
}else{
NULL
}
}

This function has the behaviors I expect:


> concat(adjectives,"er")
[1] "leaner" "faster" "stronger"

> concat(indelPositions,"i")
NULL

> concat(placing,"st")
NULL

That’s more like it!

To leave a comment for the author, please follow the link and comment on their blog: Jermdemo Raised to the Law.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.

Search R-bloggers

Sponsors

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)