1 . Introduction to R-Markdown

1.1 . Installation and Settings

R-Markdown is an useful tool for creating ”HTML” files that document R code and outputs.

An effective way to utilize R-Markdown is through the RStudio environment.

Simply create a new R Markdown file and install the necessary packages.

To enhance the visual appeal of your R-Markdown documents, consider implementing the following steps:

  • Install “pandoc” on your computer (as an additional software) via: https://github.com/jgm/pandoc/releases/tag/3.6.1)
  • Remember to “klippy” following these steps:
    • install packages “remotes”: install.packages("remotes")
    • install packages “klippy” via Github source: remotes::install_github("rlesur/klippy")
  • Choose your own theme as guidance here: https://rpubs.com/ranydc/rmarkdown_themes
  • Settings for this R-Markdown are shown below:
---
title: "Analysis of Spatial and Temporal Data"
author: "by Nguyen-Xuan Thanh"
date: "2025-01"
output:
  html_document:
    code_download: TRUE
    code_folding: show
    number_sections: TRUE
    theme: flatly
    toc: TRUE
    toc_float: TRUE
    dev: "svg"
---

1.2 . Visual Editor

If you are not familiar with R-Markdown yet, you can enable Visual Editor in RStudio, which feels similar to traditional editors like Word.

With Visual Editor, you can make some works become more simple, e.g. inserting images or screenshot as below:

Visual Editor is a more friendly way to work with RMarkdown
Visual Editor is a more friendly way to work with RMarkdown

1.3 . R coding in R-Markdown

  • You can embed an R code chunk like this:
1 + 1
## [1] 2
1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
  • Code chunks and inline R code:
rc <- 5  # radius of a circle
  • inline R code: For a circle with the radius 5, its area is 78.5398163.

  • You can also embed plot, for example:

plot(1:10, 1:10)
This is the first plot with R-Markdown

This is the first plot with R-Markdown

  • Note that the echo = FALSE parameter can be added to the code chunk to prevent printing of the R code that generated the plot.

2 . Introduction to R

2.1 . Hello World!

# Just simply typing in
"Hello World!"
## [1] "Hello World!"
# Using "print" command
print("Hello World!")
## [1] "Hello World!"
# Using "paste" command
print(paste("Hello", "World!", "1"))
## [1] "Hello World! 1"
# Combination of "print" & "paste"
print(paste("Hello", "World!", "1", sep="___"))
## [1] "Hello___World!___1"
# "paste0" command is also popular
paste0("Hello ", "World! ", "2")
## [1] "Hello World! 2"
# To known more details of a built-in function: use "help"
help("paste0")

# or
??paste0

2.2 . Basic Operators

2.2.1 . Number(s), Sequence, Vectors

# Print a number
1
## [1] 1
# Print a sequence of numbers. Interval always=1
1:100
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
##  [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100
# Using "seq". Use help(seq) or ??seq to read more details
seq(10)
##  [1]  1  2  3  4  5  6  7  8  9 10
# Some others way to create/print a sequence
100:130
##  [1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
## [20] 119 120 121 122 123 124 125 126 127 128 129 130
# or with different interval
seq(100, 130, 2)
##  [1] 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130
# A Vectors can be defined as
c(1, 3, 5, 10, 999, NA, "something", TRUE, FALSE)
## [1] "1"         "3"         "5"         "10"        "999"       NA         
## [7] "something" "TRUE"      "FALSE"

2.2.2 . Fundamental Operators

3 + 7   # Add
## [1] 10
3 - 7   # Sub
## [1] -4
3 * 7   # Mul
## [1] 21
3 / 7   # Div
## [1] 0.4285714
3 ^ 7   # Pow
## [1] 2187
3 ** 7  # Pow (same as above)
## [1] 2187

Be aware for the order of operators

2**3**2
## [1] 512
(2**3)**2
## [1] 64
2**(3**2)
## [1] 512

Multiple line calculation

5 -
  + 1 +
  + 3
## [1] 7

2.3 . Variables

2.3.1 . Defining

obj.1 <- 1     ; obj.1
## [1] 1
obj.2 <- 1:10  ; obj.2
##  [1]  1  2  3  4  5  6  7  8  9 10
obj.3 = 3      ; obj.3
## [1] 3
Obj.1 = 10     ; Obj.1
## [1] 10

Variables in r are case-sensitive

paste0("obj.1 = ", obj.1)
## [1] "obj.1 = 1"
paste0("Obj.1 = ", Obj.1)
## [1] "Obj.1 = 10"

Variable can be a result of function(s)

obj.4 = seq(from=1, to=100, by=3) ; obj.4
##  [1]   1   4   7  10  13  16  19  22  25  28  31  34  37  40  43  46  49  52  55
## [20]  58  61  64  67  70  73  76  79  82  85  88  91  94  97 100
obj.5 = rep(seq(100, 0, -10), 3) ; obj.5
##  [1] 100  90  80  70  60  50  40  30  20  10   0 100  90  80  70  60  50  40  30
## [20]  20  10   0 100  90  80  70  60  50  40  30  20  10   0

2.3.2 . Pre-set variables

pi
## [1] 3.141593
NaN
## [1] NaN
Inf
## [1] Inf
-Inf
## [1] -Inf
exp(1) # i.e., e
## [1] 2.718282
.Machine
## $double.eps
## [1] 2.220446e-16
## 
## $double.neg.eps
## [1] 1.110223e-16
## 
## $double.xmin
## [1] 2.225074e-308
## 
## $double.xmax
## [1] 1.797693e+308
## 
## $double.base
## [1] 2
## 
## $double.digits
## [1] 53
## 
## $double.rounding
## [1] 5
## 
## $double.guard
## [1] 0
## 
## $double.ulp.digits
## [1] -52
## 
## $double.neg.ulp.digits
## [1] -53
## 
## $double.exponent
## [1] 11
## 
## $double.min.exp
## [1] -1022
## 
## $double.max.exp
## [1] 1024
## 
## $integer.max
## [1] 2147483647
## 
## $sizeof.long
## [1] 8
## 
## $sizeof.longlong
## [1] 8
## 
## $sizeof.longdouble
## [1] 8
## 
## $sizeof.pointer
## [1] 8
## 
## $sizeof.time_t
## [1] 8
letters
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
LETTERS
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X" "Y" "Z"
month.abb
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
month.name
##  [1] "January"   "February"  "March"     "April"     "May"       "June"     
##  [7] "July"      "August"    "September" "October"   "November"  "December"

2.4 . Functions

2.4.1 . Built-in Function

factorial(5)
## [1] 120
sqrt(9)
## [1] 3
sqrt(1:10)
##  [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
##  [9] 3.000000 3.162278
obj.4
##  [1]   1   4   7  10  13  16  19  22  25  28  31  34  37  40  43  46  49  52  55
## [20]  58  61  64  67  70  73  76  79  82  85  88  91  94  97 100
summary(obj.4)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   25.75   50.50   50.50   75.25  100.00
min(obj.4)
## [1] 1
max(obj.4)
## [1] 100
quantile(obj.4, 0.25)
##   25% 
## 25.75
quantile(obj.4, 0.50)
##  50% 
## 50.5
quantile(obj.4, 0.75)
##   75% 
## 75.25
IQR(obj.4)
## [1] 49.5

2.4.2 User-defined Function

f.1 = function(x, y, z) {
  return(2*x^2 + 5*y - z)
}

f.1(5, 6, 1)
## [1] 79

EOF

LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgU3BhdGlhbCBhbmQgVGVtcG9yYWwgRGF0YSIKYXV0aG9yOiAiYnkgTmd1eWVuLVh1YW4gVGhhbmgiCmRhdGU6ICJVU1RILTIwMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBudW1iZXJfc2VjdGlvbnM6IFRSVUUKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBkZXY6ICJzdmciCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduID0gImNlbnRlciIpCmBgYAoKYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9CmtsaXBweTo6a2xpcHB5KGMoJ3InLCAncHl0aG9uJywgJ2pzb24nLCAnbGludXgnKSwgcG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSwKICAgICAgICAgICAgICAgdG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnQ29waWVkJykKYGBgCgojIC4gSW50cm9kdWN0aW9uIHRvIFItTWFya2Rvd24KCiMjIC4gSW5zdGFsbGF0aW9uIGFuZCBTZXR0aW5ncwoKKipSLU1hcmtkb3duKiogaXMgYW4gdXNlZnVsIHRvb2wgZm9yIGNyZWF0aW5nIOKAnUhUTUzigJ0gZmlsZXMgdGhhdCBkb2N1bWVudCBSIGNvZGUgYW5kIG91dHB1dHMuCgpBbiBlZmZlY3RpdmUgd2F5IHRvIHV0aWxpemUgKipSLU1hcmtkb3duKiogaXMgdGhyb3VnaCB0aGUgUlN0dWRpbyBlbnZpcm9ubWVudC4KClNpbXBseSBjcmVhdGUgYSBuZXcgKipSIE1hcmtkb3duKiogZmlsZSBhbmQgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzLgoKVG8gZW5oYW5jZSB0aGUgdmlzdWFsIGFwcGVhbCBvZiB5b3VyICoqUi1NYXJrZG93bioqIGRvY3VtZW50cywgY29uc2lkZXIgaW1wbGVtZW50aW5nIHRoZSBmb2xsb3dpbmcgc3RlcHM6CgotICAgSW5zdGFsbCAiKipwYW5kb2MqKiIgb24geW91ciBjb21wdXRlciAoYXMgYW4gYWRkaXRpb25hbCBzb2Z0d2FyZSkgdmlhOiA8aHR0cHM6Ly9naXRodWIuY29tL2pnbS9wYW5kb2MvcmVsZWFzZXMvdGFnLzMuNi4xPikKLSAgIFJlbWVtYmVyIHRvICIqKmtsaXBweSoqIiBmb2xsb3dpbmcgdGhlc2Ugc3RlcHM6CiAgICAtICAgaW5zdGFsbCBwYWNrYWdlcyAiKipyZW1vdGVzKioiOiBgaW5zdGFsbC5wYWNrYWdlcygicmVtb3RlcyIpYAogICAgLSAgIGluc3RhbGwgcGFja2FnZXMgIioqa2xpcHB5KioiIHZpYSAqKkdpdGh1YioqIHNvdXJjZTogYHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IilgCi0gICBDaG9vc2UgeW91ciBvd24gdGhlbWUgYXMgZ3VpZGFuY2UgaGVyZTogPGh0dHBzOi8vcnB1YnMuY29tL3JhbnlkYy9ybWFya2Rvd25fdGhlbWVzPgotICAgU2V0dGluZ3MgZm9yIHRoaXMgUi1NYXJrZG93biBhcmUgc2hvd24gYmVsb3c6CgpgYGAgICAgICAgICAKLS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgU3BhdGlhbCBhbmQgVGVtcG9yYWwgRGF0YSIKYXV0aG9yOiAiYnkgTmd1eWVuLVh1YW4gVGhhbmgiCmRhdGU6ICIyMDI1LTAxIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgZGV2OiAic3ZnIgotLS0KYGBgCgotICAgRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyAqKlIgTWFya2Rvd24qKiBzZWUgZm9sbG93aW5nIGRvY3VtZW50czoKCiAgICAtICAgb3JpZ2luYWwgZG9jdW1lbnRzOiA8aHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbT4KCiAgICAtICAgb3IgaGVyZSAoKipoaWdobHkgcmVjb21tZW5kZWQqKik6IDxodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vPgoKICAgIC0gICBvciBoZXJlOiA8aHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rLz4KCi0gICBXaGVuIHlvdSBjbGljayB0aGUgKipLbml0KiogYnV0dG9uIGEgZG9jdW1lbnQgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBpbmNsdWRlcyBib3RoIGNvbnRlbnQgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IG9mIGFueSBlbWJlZGRlZCBSIGNvZGUgY2h1bmtzIHdpdGhpbiB0aGUgZG9jdW1lbnQuCgotICAgWW91IGNhbiBhbHNvIGNvbnNpZGVyIHRvIHRpY2sgaW4gKipLbml0IG9uIFNhdmUqKiBidXR0b24uCgojIyAuIFZpc3VhbCBFZGl0b3IKCklmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggKipSLU1hcmtkb3duKiogeWV0LCB5b3UgY2FuIGVuYWJsZSAqKlZpc3VhbCBFZGl0b3IqKiBpbiAqKlJTdHVkaW8qKiwgd2hpY2ggZmVlbHMgc2ltaWxhciB0byB0cmFkaXRpb25hbCBlZGl0b3JzIGxpa2UgV29yZC4KCldpdGggKipWaXN1YWwgRWRpdG9yKiosIHlvdSBjYW4gbWFrZSBzb21lIHdvcmtzIGJlY29tZSBtb3JlIHNpbXBsZSwgZS5nLiBpbnNlcnRpbmcgaW1hZ2VzIG9yIHNjcmVlbnNob3QgYXMgYmVsb3c6CgohW1Zpc3VhbCBFZGl0b3IgaXMgYSBtb3JlIGZyaWVuZGx5IHdheSB0byB3b3JrIHdpdGggUk1hcmtkb3duXShpbWFnZXMvY2xpcGJvYXJkLTMyNDk2Mjk0MzQucG5nKQoKIyMgLiBSIGNvZGluZyBpbiBSLU1hcmtkb3duCgotICAgWW91IGNhbiBlbWJlZCBhbiAqKlIgY29kZSoqIGNodW5rIGxpa2UgdGhpczoKCmBgYHtyfQoxICsgMQoxOjEwCmBgYAoKLSAgIENvZGUgY2h1bmtzIGFuZCAqKmlubGluZSBSIGNvZGUqKjoKCmBgYHtyfQpyYyA8LSA1ICAjIHJhZGl1cyBvZiBhIGNpcmNsZQpgYGAKCi0gICAqKmlubGluZSBSIGNvZGUqKjogRm9yIGEgY2lyY2xlIHdpdGggdGhlIHJhZGl1cyAqKmByIHJjYCoqLCBpdHMgYXJlYSBpcyAqKmByIHBpICogcmNeMmAqKi4KCi0gICBZb3UgY2FuIGFsc28gZW1iZWQgKipwbG90KiosIGZvciBleGFtcGxlOgoKYGBge3IgZmlnLmRpbSA9IGMoNSwgNSksIGZpZy5jYXAgPSAiVGhpcyBpcyB0aGUgZmlyc3QgcGxvdCB3aXRoIFItTWFya2Rvd24ifQpwbG90KDE6MTAsIDE6MTApCmBgYAoKLSAgIE5vdGUgdGhhdCB0aGUgYGVjaG8gPSBGQUxTRWAgcGFyYW1ldGVyIGNhbiBiZSBhZGRlZCB0byB0aGUgY29kZSBjaHVuayB0byBwcmV2ZW50IHByaW50aW5nIG9mIHRoZSBSIGNvZGUgdGhhdCBnZW5lcmF0ZWQgdGhlIHBsb3QuCgojIC4gSW50cm9kdWN0aW9uIHRvIFIKCiMjIC4gSGVsbG8gV29ybGQhCgpgYGB7cn0KIyBKdXN0IHNpbXBseSB0eXBpbmcgaW4KIkhlbGxvIFdvcmxkISIKCiMgVXNpbmcgInByaW50IiBjb21tYW5kCnByaW50KCJIZWxsbyBXb3JsZCEiKQoKIyBVc2luZyAicGFzdGUiIGNvbW1hbmQKcHJpbnQocGFzdGUoIkhlbGxvIiwgIldvcmxkISIsICIxIikpCgojIENvbWJpbmF0aW9uIG9mICJwcmludCIgJiAicGFzdGUiCnByaW50KHBhc3RlKCJIZWxsbyIsICJXb3JsZCEiLCAiMSIsIHNlcD0iX19fIikpCgojICJwYXN0ZTAiIGNvbW1hbmQgaXMgYWxzbyBwb3B1bGFyCnBhc3RlMCgiSGVsbG8gIiwgIldvcmxkISAiLCAiMiIpCgojIFRvIGtub3duIG1vcmUgZGV0YWlscyBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uOiB1c2UgImhlbHAiCmhlbHAoInBhc3RlMCIpCgojIG9yCj8/cGFzdGUwCgpgYGAKCiMjIC4gQmFzaWMgT3BlcmF0b3JzCgojIyMgLiBOdW1iZXIocyksIFNlcXVlbmNlLCBWZWN0b3JzCgpgYGB7cn0KIyBQcmludCBhIG51bWJlcgoxCgojIFByaW50IGEgc2VxdWVuY2Ugb2YgbnVtYmVycy4gSW50ZXJ2YWwgYWx3YXlzPTEKMToxMDAKCiMgVXNpbmcgInNlcSIuIFVzZSBoZWxwKHNlcSkgb3IgPz9zZXEgdG8gcmVhZCBtb3JlIGRldGFpbHMKc2VxKDEwKQoKIyBTb21lIG90aGVycyB3YXkgdG8gY3JlYXRlL3ByaW50IGEgc2VxdWVuY2UKMTAwOjEzMAoKIyBvciB3aXRoIGRpZmZlcmVudCBpbnRlcnZhbApzZXEoMTAwLCAxMzAsIDIpCgojIEEgVmVjdG9ycyBjYW4gYmUgZGVmaW5lZCBhcwpjKDEsIDMsIDUsIDEwLCA5OTksIE5BLCAic29tZXRoaW5nIiwgVFJVRSwgRkFMU0UpCmBgYAoKIyMjIC4gRnVuZGFtZW50YWwgT3BlcmF0b3JzCgpgYGB7cn0KMyArIDcgICAjIEFkZAozIC0gNyAgICMgU3ViCjMgKiA3ICAgIyBNdWwKMyAvIDcgICAjIERpdgozIF4gNyAgICMgUG93CjMgKiogNyAgIyBQb3cgKHNhbWUgYXMgYWJvdmUpCmBgYAoKKipCZSBhd2FyZSBmb3IgdGhlIG9yZGVyIG9mIG9wZXJhdG9ycyoqCgpgYGB7cn0KMioqMyoqMgoKKDIqKjMpKioyCgoyKiooMyoqMikKYGBgCgoqKk11bHRpcGxlIGxpbmUgY2FsY3VsYXRpb24qKgoKYGBge3J9CjUgLQogICsgMSArCiAgKyAzCmBgYAoKIyMgLiBWYXJpYWJsZXMKCiMjIyAuIERlZmluaW5nCgpgYGB7cn0Kb2JqLjEgPC0gMSAgICAgOyBvYmouMQpvYmouMiA8LSAxOjEwICA7IG9iai4yCm9iai4zID0gMyAgICAgIDsgb2JqLjMKT2JqLjEgPSAxMCAgICAgOyBPYmouMQpgYGAKCioqVmFyaWFibGVzIGluIHIgYXJlIGNhc2Utc2Vuc2l0aXZlKioKCmBgYHtyfQpwYXN0ZTAoIm9iai4xID0gIiwgb2JqLjEpCnBhc3RlMCgiT2JqLjEgPSAiLCBPYmouMSkKYGBgCgoqKlZhcmlhYmxlIGNhbiBiZSBhIHJlc3VsdCBvZiBmdW5jdGlvbihzKSoqCgpgYGB7cn0Kb2JqLjQgPSBzZXEoZnJvbT0xLCB0bz0xMDAsIGJ5PTMpIDsgb2JqLjQKb2JqLjUgPSByZXAoc2VxKDEwMCwgMCwgLTEwKSwgMykgOyBvYmouNQoKYGBgCgojIyMgLiBQcmUtc2V0IHZhcmlhYmxlcwoKYGBge3J9CnBpCk5hTgpJbmYKLUluZgpleHAoMSkgIyBpLmUuLCBlCi5NYWNoaW5lCmxldHRlcnMKTEVUVEVSUwptb250aC5hYmIKbW9udGgubmFtZQpgYGAKCiMjIC4gRnVuY3Rpb25zCgojIyMgLiBCdWlsdC1pbiBGdW5jdGlvbgoKYGBge3J9CmZhY3RvcmlhbCg1KQpzcXJ0KDkpCnNxcnQoMToxMCkKYGBgCgpgYGB7cn0Kb2JqLjQKc3VtbWFyeShvYmouNCkKbWluKG9iai40KQptYXgob2JqLjQpCnF1YW50aWxlKG9iai40LCAwLjI1KQpxdWFudGlsZShvYmouNCwgMC41MCkKcXVhbnRpbGUob2JqLjQsIDAuNzUpCklRUihvYmouNCkKYGBgCgojIyMgVXNlci1kZWZpbmVkIEZ1bmN0aW9uCgpgYGB7cn0KZi4xID0gZnVuY3Rpb24oeCwgeSwgeikgewogIHJldHVybigyKnheMiArIDUqeSAtIHopCn0KCmYuMSg1LCA2LCAxKQpgYGAKCkVPRgo=