<- "Hello"
my_var <- paste0(my_var, ' world')
my_var
<- 2+3 my_other_var
Damn quotation marks
1 The problems with quotation marks.
You should understand the difference between literals and variables:
- A literal is some value which is fixed at the time the R code is written, and will remain unaltered throughout
- A variable is a reference to a value than can change during the course of the R code executing,
Look at this code example:
The strings “Hello” and ” world”, and the numbers 2 and 3 are all literals – they were specified at the time of coding and will not change by executing the R code.
The my_var and my_other_var are variables and hold values that can change during the course of code execution.
Do not use `back-ticks`, 'single', or "double" quotation marks in variable names.
String literals should always be encapsulated in single or double quotes, as illustrated in the R code above. It is common practice to use double quotes but the important thing is to use the same to start and end a string literal.
Think for a second, what would happen if you amended the code example above, like this:
<- "Hello"
my_var <- paste0("my_var", " world") my_var
The first parameter in paste0()
is a literal as it is encapsulated in quotation marks.
R will not help you spot that as an error because it has no way of knowing whether you actually mean the literal “my_var” or the value held in the variable my_var
. By using quotation marks, you’re telling R, that it is a literal – perhaps not what the programmer had in mind.
2 Help is at hand
2.1 RStudio will save you typing the closing quotation mark
When you are coding a string literal and you type the first double (or single) quotation mark, RStudio will insert the closing quotation mark as well, with the cursor placed between them. Try it out: type my_var <- "
in the console and notice the extra quotation mark inserted - keep typing to add text at the cursor position between the two quotation marks. What happens if you type my_var <- "my string literal
and finish by typing a "
?
2.2 How to include a quotation mark in a string literal?
What to do, if you want to include an actual " or ' in a string literal?
- If you choose to use single quotes to delimit your string literal, any double quotes will be regarded as a text character - not a string literal delimiter - and vice versa. In other words
"'"
and'"'
will produce a ' and ", respectively. - Alternatively, you can choose to escape the quotation make using a \ backslash.
R code
"Søren O'Neill"
'Steen "the-foot-guy" Harsted'
'I\'m pretty sure Socrates said "To be is to do"'
"..and Frank Sinatra said \"Do-be-do-be-doo\"."
Stored string values
Søren O’Neill
Steen “the-foot-guy” Harsted
I'm pretty sure Socrates said “To be is to do”
..and Frank Sinatra said "Do-be-do-be-doo".
2.3 An extra layer of complexity … the back-tics
Occasionally however, it would be nice to have variable names with special characters such as ' or spaces in them.
For example a dataframe with a column (which is a kind of variable) called Hour since midnight.
Of course, you could choose to call the column Hour_since_midnight but that might not be what you want in tables and figures.
R allows you to specify variable names with spaces in them by delimiting the variable name using ` back ticks. E.g.:
library(tibble) # Part of tidyverse
<- tibble(`Hour since midnight` = 0:23) # A 1x23 tibble data frame
df
`my var` <- 2+3
This is not recommended as general practice, but can sometimes save you a lot of code when creating tables and figures. Look at these two examples which produce the exact same plot:
library(ggplot2)
<- data.frame(Hour_since_midnight <- 1:5,
df <- c(45,110,54,102,87))
A_random_number |>
df ggplot(aes(x=Hour_since_midnight, y=A_random_number)) +
geom_col() +
xlab("Hour since midnight") +
ylab("A random number")
library(ggplot2)
<- data.frame(`Hour since midnight` <- 1:5,
df `A random number` <- c(45,110,54,102,87))
|>
df ggplot(aes(x=`Hour since midnight`, y=`A random number`)) +
geom_col()
As we did not specify axes labels in the second code chunk, the variable column names are used by default.
3 Problemer med anførselstegn
Du bør forstå forskellen mellem literaler og variable:
- En literal er en værdi, som er fastsat på det tidspunkt, hvor R-koden skrives, og som forbliver uændret.
- En variabel er en reference til en værdi, der kan ændre sig under udførelsen af R-koden.
Se dette kodeeksempel:
<- "Hello"
my_var <- paste0(my_var, ' world')
my_var
<- 2+3 my_other_var
Strengene “Hello” og ” world” samt tallene 2 og 3 er alle literaler – de blev specificeret på kodningstidspunktet og ændres ikke ved udførelsen af R-koden.
Variablerne my_var
og my_other_var
derimod holder værdier, som kan ændres under udførelsen af koden.
Undgå at bruge `backticks`, 'enkelt' eller "dobbelt" anførselstegn i variabelnavne.
String-literaler skal altid omsluttes af enten enkelt- eller dobbeltanførselstegn, som vist i R-koden ovenfor. Det er almindelig praksis at bruge dobbeltanførselstegn, men det vigtigste er, at du bruger de samme tegn til at starte og slutte en string-literal.
Tænk over, hvad der ville ske, hvis du ændrede kodeeksemplet ovenfor til dette:
<- "Hello"
my_var <- paste0("my_var", " world") my_var
Man kunne måske formode, at "my_var"
er en fejl og at programmøren faktisk mente my_var
, altså ikke den literale værdie "my_var"
men indholdet af variblen – men hvor skulle R vide det fra?.
Den første parameter i paste0()
er en literal eftersom den er afgrænset af citationstegn.
R kan ikke hjælpe dig med at opdage fejlen er fordi R ikke kan vide om du faktisk mener literal’en “my_var” eller værdien af variablen my_var
. Ved at bruge citationstegn, angiver du at der er tale en en literal – muligvis var det ikke det programmøren havde tiltænkt.
4 Hjælp er inden for rækkevidde
4.1 RStudio skriver det afsluttende anførselstegn for dig
Når du koder en string-literal og skriver det første dobbelte (eller enkelte) anførselstegn, indsætter RStudio det afsluttende anførselstegn automatisk og placerer markøren mellem dem. Prøv det: Skriv my_var <- "
i konsollen, og bemærk det ekstra anførselstegn, der bliver indsat – fortsæt med at skrive tekst mellem de to anførselstegn. Hvad sker der, hvis du skriver my_var <- "my string literal
og slutter af med at skrive et "
?
4.2 Hvordan inkluderer man et anførselstegn i en string-literal?
Hvad gør du, hvis du ønsker at inkludere et faktisk " eller ' i en string-literal?
- Hvis du vælger at bruge enkeltanførselstegn til at afgrænse din string-literal, vil eventuelle dobbelte anførselstegn blive betragtet som teksttegn – ikke som afgrænsningstegn – og omvendt. Med andre ord vil
"'"
og'"'
producere henholdsvis ' og ". - Alternativt kan du escape anførselstegnet ved hjælp af en \ backslash.
"Søren O'Neill"
'Steen "the-foot-guy" Harsted'
'I\'m pretty sure Socrates said "To be is to do"'
"..and Frank Sinatra said \"Do-be-do-be-doo\"."
Søren O’Neill
Steen “the-foot-guy” Harsted
I'm pretty sure Kungfucius said “To do is to be”
..and Frank Sinatra said "Do-be-do-be-doo".
4.3 Et ekstra lag af kompleksitet … backticks
Nogle gange kan det være nyttigt at have variabelnavne med specialtegn som ' eller mellemrum.
For eksempel en data frame med en kolonne (som er en slags variabel) kaldet Hour since midnight.
Du kunne selvfølgelig vælge at kalde kolonnen Hour_since_midnight, men det er måske ikke ønskeligt i tabeller og figurer.
Tidyverse tillader dig at specificere variabelnavne med mellemrum ved at omslutte navnet med ` backticks. F.eks.:
library(tibble) # Del af tidyverse
<- tibble(`Hour since midnight` = 0:23)
df
`my var` <- 2+3
Dette anbefales ikke som generel praksis, men det kan nogle gange spare dig for meget kode, når du opretter tabeller og figurer. Se på disse to eksempler, som producerer den samme graf:
library(ggplot2)
<- data.frame(Hour_since_midnight <- 1:5,
df <- c(45,110,54,102,87))
A_random_number |>
df ggplot(aes(x=Hour_since_midnight, y=A_random_number)) +
geom_col() +
xlab("Hour since midnight") +
ylab("A random number")
library(ggplot2)
<- data.frame(`Hour since midnight` <- 1:5,
df `A random number` <- c(45,110,54,102,87))
|>
df ggplot(aes(x=`Hour since midnight`, y=`A random number`)) +
geom_col()
Da vi ikke angav akseetiketter i den anden kodeblok, blev kolonnenavnene brugt som standard.