Use Cases

The following examples demonstrate using chars objects inside functions, no longer needing to spell out strsplit(x, "")[[1]] every time.

library(charcuterie)

Test Membership

Which letters are vowels (aeiou)?

vowels <- function(word) {
  ch <- chars(word)
  setNames(ch %in% chars("aeiou"), ch)
}
vowels("string")
#>     s     t     r     i     n     g 
#> FALSE FALSE FALSE  TRUE FALSE FALSE
vowels("banana")
#>     b     a     n     a     n     a 
#> FALSE  TRUE FALSE  TRUE FALSE  TRUE

Since %in% is vectorised, it works nicely with a chars object

banana <- chars("banana")
banana[which(banana %in% chars("aeiou"))]
#> [1] "aaa"

onomatopoeia <- chars("onomatopoeia")
onomatopoeia[which(onomatopoeia %in% chars("aeiou"))]
#> [1] "ooaooeia"

Iterate

“Strings” are finally iterable

for (x in chars("ABC")) {
  print(paste("Appendix", x))
}
#> [1] "Appendix A"
#> [1] "Appendix B"
#> [1] "Appendix C"

Identify Palindromes

Is a word a palindrome (spelled the same forwards and backwards)?

palindrome <- function(a, ignore_spaces = FALSE) {
  a <- chars(a)
  if (ignore_spaces) a <- except(a, " ")
  all(rev(a) == a)
}
palindrome("palindrome")
#> [1] FALSE
palindrome("racecar")
#> [1] TRUE
palindrome("never odd or even", ignore_spaces = TRUE)
#> [1] TRUE
palindrome("go hang a salami im a lasagna hog", ignore_spaces = TRUE)
#> [1] TRUE

Find Anagrams

Are two words just rearrangements of their letters?

anagram <- function(a, b) {
  is_anagram <- function(a, b) {
    length(a) == length(b) && all(sort(a) == sort(b))
  }
  sapply(candidates, \(x) is_anagram(chars(a), chars(x)))
}
target <- "stressed"
candidates <- c("started", "desserts", "rested")
anagram(target, candidates)
#>  started desserts   rested 
#>    FALSE     TRUE    FALSE

Spongebob Case

Make every second letter uppercase

spongebob <- function(phrase) {
  x <- chars(phrase)
  odds <- seq(1, length(x), 2)
  x[odds] <- toupper(x[odds])
  string(x)
}
spongebob("you can't do anything useful with this package")
#> [1] "YoU CaN'T Do aNyThInG UsEfUl wItH ThIs pAcKaGe"