pacman::p_load(tidyverse,lubridate,rlang)

Suppose we want to put double quotation marks around a group of words.

words<-"Monday, Tuesday, Wednesday, Thursday,Friday"
paste("2016-06-01",today(),sep = ",")
[1] "2016-06-01,2017-12-15"
sapply(strsplit(words, '[, ]+'), function(x) toString(dQuote(x)))
[1] "“Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”"
cat(sapply(strsplit(words, '[, ]+'), function(x) toString(dQuote(x))))
“Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”
cat(sapply(strsplit(words, '[, ]+'), function(x) toString(sQuote(x))))
‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’
Hmisc::Cs(words)
[1] "words"
cat(sapply(strsplit(paste("2016-06-01",today(),sep = ","), '[, ]+'), function(x) toString(dQuote(x))))
“2016-06-01”, “2017-12-15”
paste(dQuote(sub(" ","",unlist(strsplit(words,split = ",")))),collapse = ", ")
[1] "“Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”"
#cat(paste(sQuote("2016-06-01"),sQuote(end),sep=","), "\n")
#cat(paste(dQuote("2016-06-01"),dQuote(end),sep=","), "\n")
as.vector(words)
[1] "Monday, Tuesday, Wednesday, Thursday,Friday"
Hmisc::Cs(quote(as.vector(words)))
[1] "quote(as.vector(words))"
dQuote(words)
[1] "“Monday, Tuesday, Wednesday, Thursday,Friday”"
w=as.list(words)
sapply(as.list(words),dQuote)
[1] "“Monday, Tuesday, Wednesday, Thursday,Friday”"
strsplit(words, '[, ]+')
[[1]]
[1] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
sapply(strsplit(words, '[, ]+'),dQuote)
     [,1]         
[1,] "“Monday”"   
[2,] "“Tuesday”"  
[3,] "“Wednesday”"
[4,] "“Thursday”" 
[5,] "“Friday”"   
quo(w)
<quosure: global>
~w
end=today()
cat(paste(sQuote("2016-06-01"),sQuote(end),sep=","), "\n")
‘2016-06-01’,‘2017-12-15’ 
cat(paste(dQuote("2016-06-01"),dQuote(end),sep=","), "\n")
“2016-06-01”,“2017-12-15” 
# quo() is a quotation function just like expr() and quote():
expr(mean(1:10 * 2))
mean(1:10 * 2)
quo(mean(1:10 * 2))
<quosure: global>
~mean(1:10 * 2)
# It supports quasiquotation and allows unquoting (evaluating
# immediately) part of the quoted expression:
quo(mean(!! 1:10 * 2))
<quosure: global>
~mean(c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20))
quo(!! mean(1:10 * 2))
<quosure: empty>
~11
# What makes quo() often safer to use than quote() and expr() is
# that it keeps track of the contextual environment. This is
# especially important if you're referring to local variables in
# the expression:
var <- "foo"
quo <- quo(var)
quo
<quosure: global>
~var
quo(!!var)
<quosure: empty>
~"foo"
eval_tidy(var)
[1] "foo"
# Here `quo` quotes `var`. Let's check that it also captures the
# environment where that symbol is defined:
identical(get_env(quo), get_env())
[1] TRUE
env_has(quo, "var")
[1] TRUE
# Keeping track of the environment is important when you quote an
# expression in a context (that is, a particular function frame)
# and pass it around to other functions (which will be run in their
# own evaluation frame):
fn <- function() {
  foobar <- 10
  quo(foobar * 2)
}
quo <- fn()
quo
<quosure: local>
~foobar * 2
# `foobar` is not defined here but was defined in `fn()`'s
# evaluation frame. However, the quosure keeps track of that frame
# and is safe to evaluate:
eval_tidy(quo)
[1] 20
# Quoting as a quosure is necessary to preserve scope information
# and make sure objects are looked up in the right place. However,
# there are situations where it can get in the way. This is the
# case when you deal with non-tidy NSE functions that do not
# understand formulas. You can inline the RHS of a formula in a
# call thanks to the UQE() operator:
nse_function <- function(arg) substitute(arg)
var <- locally(quo(foo(bar)))
quo(nse_function(UQ(var)))
<quosure: global>
~nse_function(~foo(bar))
quo(nse_function(UQE(var)))
<quosure: global>
~nse_function(foo(bar))
# This is equivalent to unquoting and taking the RHS:
quo(nse_function(!! get_expr(var)))
<quosure: global>
~nse_function(foo(bar))
# One of the most important old-style NSE function is the dollar
# operator. You need to use UQE() for subsetting with dollar:
var <- quo(cyl)
quo(mtcars$UQE(var))
<quosure: global>
~mtcars$cyl
# `!!`() is also treated as a shortcut. It is meant for situations
# where the bang operator would not parse, such as subsetting with
# $. Since that's its main purpose, we've made it a shortcut for
# UQE() rather than UQ():
var <- quo(cyl)
quo(mtcars$`!!`(var))
<quosure: global>
~mtcars$cyl
# When a quosure is printed in the console, the brackets indicate
# if the enclosure is the global environment or a local one:
locally(quo(foo))
<quosure: local>
~foo
# Literals are enquosed with the empty environment because they can
# be evaluated anywhere. The brackets indicate "empty":
quo(10L)
<quosure: empty>
~10L
LS0tCnRpdGxlOiAiVHV0b3JpYWwgb24gdXNpbmcgUXVvdGVzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBOYW5hIEJvYXRlbmcKZGZfcHJpbnQ6IHBhZ2VkClRpbWU6ICdgciBTeXMudGltZSgpYCcKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgotLS0KCgoKCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9Cgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBvdXQud2lkdGggPSIxMDAlIiwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdkZWZhdWx0JywgCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgZmlnLmNhcCA9IkZpZy4gMzAiLCAKICAgICAgICAgICAgICAgICAgICAgIG91dC53aWR0aD0iMTAwJSIpCgpgYGAKCgoKYGBge3J9CnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSxsdWJyaWRhdGUscmxhbmcpCmBgYAoKU3VwcG9zZSB3ZSB3YW50IHRvIHB1dCBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCBhIGdyb3VwIG9mIHdvcmRzLgpgYGB7ciBjYXJzfQp3b3JkczwtIk1vbmRheSwgVHVlc2RheSwgV2VkbmVzZGF5LCBUaHVyc2RheSxGcmlkYXkiCgoKcGFzdGUoIjIwMTYtMDYtMDEiLHRvZGF5KCksc2VwID0gIiwiKQoKc2FwcGx5KHN0cnNwbGl0KHdvcmRzLCAnWywgXSsnKSwgZnVuY3Rpb24oeCkgdG9TdHJpbmcoZFF1b3RlKHgpKSkKCmNhdChzYXBwbHkoc3Ryc3BsaXQod29yZHMsICdbLCBdKycpLCBmdW5jdGlvbih4KSB0b1N0cmluZyhkUXVvdGUoeCkpKSkKCgpjYXQoc2FwcGx5KHN0cnNwbGl0KHdvcmRzLCAnWywgXSsnKSwgZnVuY3Rpb24oeCkgdG9TdHJpbmcoc1F1b3RlKHgpKSkpCgoKCmBgYAoKCmBgYHtyfQpIbWlzYzo6Q3Mod29yZHMpCgoKY2F0KHNhcHBseShzdHJzcGxpdChwYXN0ZSgiMjAxNi0wNi0wMSIsdG9kYXkoKSxzZXAgPSAiLCIpLCAnWywgXSsnKSwgZnVuY3Rpb24oeCkgdG9TdHJpbmcoZFF1b3RlKHgpKSkpCgpwYXN0ZShkUXVvdGUoc3ViKCIgIiwiIix1bmxpc3Qoc3Ryc3BsaXQod29yZHMsc3BsaXQgPSAiLCIpKSkpLGNvbGxhcHNlID0gIiwgIikKCgoKYGBgCgoKYGBge3J9CmFzLnZlY3Rvcih3b3JkcykKCkhtaXNjOjpDcyhxdW90ZShhcy52ZWN0b3Iod29yZHMpKSkKCmRRdW90ZSh3b3JkcykKCnc9YXMubGlzdCh3b3JkcykKCnNhcHBseShhcy5saXN0KHdvcmRzKSxkUXVvdGUpCgpzdHJzcGxpdCh3b3JkcywgJ1ssIF0rJykKCnNhcHBseShzdHJzcGxpdCh3b3JkcywgJ1ssIF0rJyksZFF1b3RlKQoKcXVvKHcpCgpgYGAKCgpgYGB7cn0KZW5kPXRvZGF5KCkKCmNhdChwYXN0ZShzUXVvdGUoIjIwMTYtMDYtMDEiKSxzUXVvdGUoZW5kKSxzZXA9IiwiKSwgIlxuIikKCgpjYXQocGFzdGUoZFF1b3RlKCIyMDE2LTA2LTAxIiksZFF1b3RlKGVuZCksc2VwPSIsIiksICJcbiIpCmBgYAoKYGBge3J9CiMgcXVvKCkgaXMgYSBxdW90YXRpb24gZnVuY3Rpb24ganVzdCBsaWtlIGV4cHIoKSBhbmQgcXVvdGUoKToKZXhwcihtZWFuKDE6MTAgKiAyKSkKcXVvKG1lYW4oMToxMCAqIDIpKQoKYGBgCgpgYGB7cn0KCiMgSXQgc3VwcG9ydHMgcXVhc2lxdW90YXRpb24gYW5kIGFsbG93cyB1bnF1b3RpbmcgKGV2YWx1YXRpbmcKIyBpbW1lZGlhdGVseSkgcGFydCBvZiB0aGUgcXVvdGVkIGV4cHJlc3Npb246CnF1byhtZWFuKCEhIDE6MTAgKiAyKSkKCnF1byghISBtZWFuKDE6MTAgKiAyKSkKYGBgCgpgYGB7cn0KIyBXaGF0IG1ha2VzIHF1bygpIG9mdGVuIHNhZmVyIHRvIHVzZSB0aGFuIHF1b3RlKCkgYW5kIGV4cHIoKSBpcwojIHRoYXQgaXQga2VlcHMgdHJhY2sgb2YgdGhlIGNvbnRleHR1YWwgZW52aXJvbm1lbnQuIFRoaXMgaXMKIyBlc3BlY2lhbGx5IGltcG9ydGFudCBpZiB5b3UncmUgcmVmZXJyaW5nIHRvIGxvY2FsIHZhcmlhYmxlcyBpbgojIHRoZSBleHByZXNzaW9uOgp2YXIgPC0gImZvbyIKcXVvIDwtIHF1byh2YXIpCnF1bwoKI2V2YWx1YXRlCnF1byghIXZhcikKI0VxdWl2YWxlbnRseQpldmFsX3RpZHkodmFyKQpgYGAKCgpgYGB7cn0KIyBIZXJlIGBxdW9gIHF1b3RlcyBgdmFyYC4gTGV0J3MgY2hlY2sgdGhhdCBpdCBhbHNvIGNhcHR1cmVzIHRoZQojIGVudmlyb25tZW50IHdoZXJlIHRoYXQgc3ltYm9sIGlzIGRlZmluZWQ6CmlkZW50aWNhbChnZXRfZW52KHF1byksIGdldF9lbnYoKSkKZW52X2hhcyhxdW8sICJ2YXIiKQoKYGBgCgoKYGBge3J9CiMgS2VlcGluZyB0cmFjayBvZiB0aGUgZW52aXJvbm1lbnQgaXMgaW1wb3J0YW50IHdoZW4geW91IHF1b3RlIGFuCiMgZXhwcmVzc2lvbiBpbiBhIGNvbnRleHQgKHRoYXQgaXMsIGEgcGFydGljdWxhciBmdW5jdGlvbiBmcmFtZSkKIyBhbmQgcGFzcyBpdCBhcm91bmQgdG8gb3RoZXIgZnVuY3Rpb25zICh3aGljaCB3aWxsIGJlIHJ1biBpbiB0aGVpcgojIG93biBldmFsdWF0aW9uIGZyYW1lKToKZm4gPC0gZnVuY3Rpb24oKSB7CiAgZm9vYmFyIDwtIDEwCiAgcXVvKGZvb2JhciAqIDIpCn0KcXVvIDwtIGZuKCkKcXVvCmBgYAoKYGBge3J9CiMgYGZvb2JhcmAgaXMgbm90IGRlZmluZWQgaGVyZSBidXQgd2FzIGRlZmluZWQgaW4gYGZuKClgJ3MKIyBldmFsdWF0aW9uIGZyYW1lLiBIb3dldmVyLCB0aGUgcXVvc3VyZSBrZWVwcyB0cmFjayBvZiB0aGF0IGZyYW1lCiMgYW5kIGlzIHNhZmUgdG8gZXZhbHVhdGU6CmV2YWxfdGlkeShxdW8pCgoKYGBgCgoKYGBge3J9CiMgUXVvdGluZyBhcyBhIHF1b3N1cmUgaXMgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIHNjb3BlIGluZm9ybWF0aW9uCiMgYW5kIG1ha2Ugc3VyZSBvYmplY3RzIGFyZSBsb29rZWQgdXAgaW4gdGhlIHJpZ2h0IHBsYWNlLiBIb3dldmVyLAojIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGl0IGNhbiBnZXQgaW4gdGhlIHdheS4gVGhpcyBpcyB0aGUKIyBjYXNlIHdoZW4geW91IGRlYWwgd2l0aCBub24tdGlkeSBOU0UgZnVuY3Rpb25zIHRoYXQgZG8gbm90CiMgdW5kZXJzdGFuZCBmb3JtdWxhcy4gWW91IGNhbiBpbmxpbmUgdGhlIFJIUyBvZiBhIGZvcm11bGEgaW4gYQojIGNhbGwgdGhhbmtzIHRvIHRoZSBVUUUoKSBvcGVyYXRvcjoKbnNlX2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKGFyZykgc3Vic3RpdHV0ZShhcmcpCnZhciA8LSBsb2NhbGx5KHF1byhmb28oYmFyKSkpCnF1byhuc2VfZnVuY3Rpb24oVVEodmFyKSkpCnF1byhuc2VfZnVuY3Rpb24oVVFFKHZhcikpKQoKCiMgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHVucXVvdGluZyBhbmQgdGFraW5nIHRoZSBSSFM6CnF1byhuc2VfZnVuY3Rpb24oISEgZ2V0X2V4cHIodmFyKSkpCgpgYGAKCmBgYHtyfQojIE9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgb2xkLXN0eWxlIE5TRSBmdW5jdGlvbiBpcyB0aGUgZG9sbGFyCiMgb3BlcmF0b3IuIFlvdSBuZWVkIHRvIHVzZSBVUUUoKSBmb3Igc3Vic2V0dGluZyB3aXRoIGRvbGxhcjoKdmFyIDwtIHF1byhjeWwpCnF1byhtdGNhcnMkVVFFKHZhcikpCgoKIyBgISFgKCkgaXMgYWxzbyB0cmVhdGVkIGFzIGEgc2hvcnRjdXQuIEl0IGlzIG1lYW50IGZvciBzaXR1YXRpb25zCiMgd2hlcmUgdGhlIGJhbmcgb3BlcmF0b3Igd291bGQgbm90IHBhcnNlLCBzdWNoIGFzIHN1YnNldHRpbmcgd2l0aAojICQuIFNpbmNlIHRoYXQncyBpdHMgbWFpbiBwdXJwb3NlLCB3ZSd2ZSBtYWRlIGl0IGEgc2hvcnRjdXQgZm9yCiMgVVFFKCkgcmF0aGVyIHRoYW4gVVEoKToKdmFyIDwtIHF1byhjeWwpCnF1byhtdGNhcnMkYCEhYCh2YXIpKQoKCmBgYAoKYGBge3J9CiMgV2hlbiBhIHF1b3N1cmUgaXMgcHJpbnRlZCBpbiB0aGUgY29uc29sZSwgdGhlIGJyYWNrZXRzIGluZGljYXRlCiMgaWYgdGhlIGVuY2xvc3VyZSBpcyB0aGUgZ2xvYmFsIGVudmlyb25tZW50IG9yIGEgbG9jYWwgb25lOgpsb2NhbGx5KHF1byhmb28pKQoKIyBMaXRlcmFscyBhcmUgZW5xdW9zZWQgd2l0aCB0aGUgZW1wdHkgZW52aXJvbm1lbnQgYmVjYXVzZSB0aGV5IGNhbgojIGJlIGV2YWx1YXRlZCBhbnl3aGVyZS4gVGhlIGJyYWNrZXRzIGluZGljYXRlICJlbXB0eSI6CnF1bygxMEwpCmBgYAoK