---
title: "Example Usage"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Example Usage}
%\VignetteEncoding{UTF-8}
%\VignetteEngine{knitr::rmarkdown}
editor_options:
chunk_output_type: console
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
With strings encoded as a vector of characters, we can perform vector operations
over the _actual_ characters. All {charcuterie} functions aim to return a new
object of class "chars" so it is also able to be printed as a string and passed
to other vector-handling functions.
```{r setup}
library(charcuterie)
```
To convert a regular string into a `chars` object, use `chars()`. This prints as
a string, but is actually a vector
```{r}
chars("string")
# but it's a vector
unclass(chars("string"))
```
Only a single string can be converted this way, so if you want to produce more
than one of these, I suggest
```{r}
many_chars <- lapply(c("foo", "bar", "baz"), chars)
many_chars
unclass(many_chars[[2]])
```
A regular string can be recovered using `string()` which pastes the characters
back together
```{r}
string(chars("string"))
```
and this can optionally take a separator
```{r}
string(chars("string"), collapse = "|")
```
Because the `chars` object is a vector we can do vector things, such as indexing
```{r}
"string"[3] # doesn't work
chars("string")[3]
chars("banana")[seq(2, 6, 2)]
```
subsetting
```{r}
head("string", 3) # doesn't work
head(chars("string"), 3)
tail(chars("string"), 3)
```
substituting
```{r}
word <- chars("string")
word[3] <- "R"
word
```
tabulating
```{r}
table("mississippi") # doesn't work
table(chars("mississippi"))
```
sorting
```{r}
sort("string") # doesn't work
sort(chars("string"))
sort(chars("string"), decreasing = TRUE)
```
reversing
```{r}
rev("string") # doesn't work
rev(chars("string"))
```
Since these are vectors, we no longer need `nchar` to determine the length
```{r}
length("string") # just the one 'string'
length(chars("string")) == nchar("string")
```
Membership tests can now determine if a given character is in the 'string'
```{r}
"i" %in% "rhythm" # doesn't work
"y" %in% "rhythm" # doesn't work
"i" %in% chars("rhythm")
"y" %in% chars("rhythm")
is.element("y", "rhythm") # doesn't work
is.element("y", chars("rhythm"))
```
`chars` objects can be concatenated; combining two strings produces a longer string
```{r}
c("butter", "fly") # doesn't work in the character sense
c(chars("butter"), chars("fly"))
c(chars("butter"), chars("fly"))[c(1, 9)]
```
Set operations can be useful
```{r}
setdiff(chars("javascript"), chars("script"))
union(chars("bunny"), chars("rabbit"))
intersect(chars("bob"), chars("rob"))
setequal(chars("stop"), chars("post"))
setequal(chars("stop"), chars("posit"))
unique(chars("mississippi"))
```
Since `chars` objects are regular vectors, they continue to work with
other vectorised operations
```{r}
rev(toupper(chars("string")))
toString(chars("abc"))
Filter(\(x) x != "a", "banana")
Filter(\(x) x != "a", chars("banana"))
```
This last example motivates a non-set-wise way to exclude some characters, so this
package introduces a new `except` function
```{r}
except(chars("javascript"), chars("script"))
except(chars("carpet"), chars("car"))
except(chars("banana"), "a")
except(chars("banana"), chars("a"))
```
Anywhere a vector of individual character works, a `chars` object should also work
```{r}
data.frame(number = 1:3, letter = chars("abc"))
```