Glue offers interpreted string literals that are small, fast, and dependency-free. Glue does this by embedding R expressions in curly braces which are then evaluated and inserted into the argument string.
# Install the released version from CRAN: install.packages("glue") # Install the development version from GitHub: # install.packages("devtools") devtools::install_github("tidyverse/glue")
glue_data() is useful with magrittr pipes.library(dplyr) head(iris) %>% mutate(description = glue("This {Species} has a petal length of {Petal.Length}")) #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3.0 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa #> 4 4.6 3.1 1.5 0.2 setosa #> 5 5.0 3.6 1.4 0.2 setosa #> 6 5.4 3.9 1.7 0.4 setosa #> description #> 1 This setosa has a petal length of 1.4 #> 2 This setosa has a petal length of 1.4 #> 3 This setosa has a petal length of 1.3 #> 4 This setosa has a petal length of 1.5 #> 5 This setosa has a petal length of 1.4 #> 6 This setosa has a petal length of 1.7
This lets you indent the strings naturally in code.
glue(" A formatted string Can have multiple lines with additional indention preserved ") #> A formatted string #> Can have multiple lines #> with additional indention preserved
glue(" leading or trailing newlines can be added explicitly ") #> #> leading or trailing newlines can be added explicitly
\\ at the end of a line continues it without a new line.glue(" A formatted string \\ can also be on a \\ single line ") #> A formatted string can also be on a single line
name <- "Fred" glue("My name is {name}, not {{name}}.") #> My name is Fred, not {name}.
.open and .close.one <- "1" glue("The value of $e^{2\\pi i}$ is $<<one>>$.", .open = "<<", .close = ">>") #> The value of $e^{2\pi i}$ is $1$.
Backslashes do need to be doubled just like in all R strings.
`foo}\`` <- "foo" glue("{ { '}\\'' # { and } in comments, single quotes \"}\\\"\" # or double quotes are ignored `foo}\\`` # as are { in backticks } }") #> foo
glue_sql() makes constructing SQL statements safe and easyUse backticks to quote identifiers, normal strings and numbers are quoted appropriately for your backend.
library(glue) con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:") colnames(iris) <- gsub("[.]", "_", tolower(colnames(iris))) DBI::dbWriteTable(con, "iris", iris) var <- "sepal_width" tbl <- "iris" num <- 2 val <- "setosa" glue_sql(" SELECT {`var`} FROM {`tbl`} WHERE {`tbl`}.sepal_length > {num} AND {`tbl`}.species = {val} ", .con = con) #> <SQL> SELECT `sepal_width` #> FROM `iris` #> WHERE `iris`.sepal_length > 2 #> AND `iris`.species = 'setosa' # `glue_sql()` can be used in conjunction with parameterized queries using # `DBI::dbBind()` to provide protection for SQL Injection attacks sql <- glue_sql(" SELECT {`var`} FROM {`tbl`} WHERE {`tbl`}.sepal_length > ? ", .con = con) query <- DBI::dbSendQuery(con, sql) DBI::dbBind(query, list(num)) DBI::dbFetch(query, n = 4) #> sepal_width #> 1 3.5 #> 2 3.0 #> 3 3.2 #> 4 3.1 DBI::dbClearResult(query) # `glue_sql()` can be used to build up more complex queries with # interchangeable sub queries. It returns `DBI::SQL()` objects which are # properly protected from quoting. sub_query <- glue_sql(" SELECT * FROM {`tbl`} ", .con = con) glue_sql(" SELECT s.{`var`} FROM ({sub_query}) AS s ", .con = con) #> <SQL> SELECT s.`sepal_width` #> FROM (SELECT * #> FROM `iris`) AS s # If you want to input multiple values for use in SQL IN statements put `*` # at the end of the value and the values will be collapsed and quoted appropriately. glue_sql("SELECT * FROM {`tbl`} WHERE sepal_length IN ({vals*})", vals = 1, .con = con) #> <SQL> SELECT * FROM `iris` WHERE sepal_length IN (1) glue_sql("SELECT * FROM {`tbl`} WHERE sepal_length IN ({vals*})", vals = 1:5, .con = con) #> <SQL> SELECT * FROM `iris` WHERE sepal_length IN (1, 2, 3, 4, 5) glue_sql("SELECT * FROM {`tbl`} WHERE species IN ({vals*})", vals = "setosa", .con = con) #> <SQL> SELECT * FROM `iris` WHERE species IN ('setosa') glue_sql("SELECT * FROM {`tbl`} WHERE species IN ({vals*})", vals = c("setosa", "versicolor"), .con = con) #> <SQL> SELECT * FROM `iris` WHERE species IN ('setosa', 'versicolor')
+
x <- 1 y <- 3 glue("x + y") + " = {x + y}" #> x + y = 4
Some other implementations of string interpolation in R (although not using identical syntax).
String templating is closely related to string interpolation, although not exactly the same concept. Some packages implementing string templating in R include.
Please note that the glue project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.