$$\begin{split} x & = 16(\text{sin}t)^3 \\ y & = 13\text{cos}t – 5\text{cos}2t – 2\text{cos}3t – \text{cos}4t \end{split}$$

library(grid)
# heart function
heart <- function(lcolor) {
t = seq(0, 2 * pi, by = 0.1)
x = 16 * sin(t)^3
y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
a = (x - min(x))/(max(x) - min(x))
b = (y - min(y))/(max(y) - min(y))
grid.lines(a, b, gp = gpar(col = lcolor, lty = "solid", lwd = 3))
}
heart("hotpink")

# rose function
grid.newpage()
rose = function() {
grid.circle(x = 0.5, y = 0.5, r = 0.5, gp = gpar(fill = "red",
lwd = 3))
vp <- viewport(0.5, 0.5, w = 0.9, h = 0.9)
pushViewport(vp)
grid.polygon(x = c(0.08, 0.5, 0.94), y = c(0.22, 1.03, 0.22),
gp = gpar(lwd = 3))
vp2 <- viewport(0.5, 0.5, w = 0.4, h = 0.4)
pushViewport(vp2)
grid.circle(x = 0.5, y = 0.5, r = 0.5, gp = gpar(fill = "red",
lwd = 3))
vp3 <- viewport(0.5, 0.5, w = 0.9, h = 0.9, angle = 180)
pushViewport(vp3)
grid.polygon(x = c(0.08, 0.5, 0.94), y = c(0.22, 1.03, 0.22),
gp = gpar(lwd = 3))
}
rose()

# pattern 1
grid.newpage()
pushViewport(viewport(x = 0.1, y = 0.1, w = 0.2, h = 0.2))
grid.newpage()
for (j in 1:30) {
vp <- viewport(0.5, 0.5, w = 0.9, h = 0.9)
pushViewport(vp)
heart("hotpink")
}

# pattern 2
grid.newpage()
vp1 <- viewport(0.4, 0.5, w = 0.5, h = 0.5, angle = 15)
pushViewport(vp1)
heart("red")
vp2 <- viewport(0.9, 0.27, w = 0.7, h = 0.7, angle = -30)
pushViewport(vp2)
heart("hotpink")
grid.text("Happy valentine's day!", x = 0.2, y = 1.2, just = c("center",
"bottom"), gp = gpar(fontsize = 20), vp = vp)
vp3 <- viewport(-0.65, 1.2, w = 0.3, h = 0.3, angle = -30)
pushViewport(vp3)
rose()