Q:

Qual é a utilidade dos escopos léxico e dinâmico no R?

No capítulo 6 do livro Advanced R existem as definições dos escopos léxico e dinâmico. No entanto, não compreendi a utilidade de saber estes conceitos em r. Assim,

qual a utilidade do escopo léxico em r?
qual a utilidade do escopo dinâmico em r?

O autor oferece diversos exemplos sobre estas formas de escopo. Mas, reitero, necessito saber a utilidade disso.
Esta pergunta pode ser considerada um adendo a esta aqui. Veja que, mesmo que o SOpt possua questões sobre construtor e herança em outras linguagens de programação, no r alguns conceitos podem ter menor ou maior utilidade de emprego.
E é isso que desejo saber: utilidade dos escopos léxico e dinâmico no r.

A:

Esses conceitos são bastante importantes para quem desenvolve pacotes em R e precisa criar comportamentos complexos de funções, embora para o dia a dia da análise de dados não seja tão necessário.
Primeiro, para entender o conceito de escopo léxico e escopo dinâmico, acho que o melhor exemplo é o a seguir:
y <- 100

f <- function(x) {
  y <- 2
  g(x)
}

g <- function(x) { 
  x*y
}

f(5)
[1] 500
g(5)
[1] 500

No R, o escopo é léxico, isso é, as funções procuram os valores das variáveis no mesmo ambiente em que foram definidas e não no ambiente em que foram chamadas. No exemplo acima, se o escopo fosse dinâmico então y assumiria o valor 2 e o resultado de f(5) seria 10. É importante notar que se você alterar o valor de y posteriormente à criação da função, o R usará o novo valor. Por exemplo:
y <- 10
f(5)
[1] 50

Ou seja, o R guarda onde procurar o valor da variável e não o valor da variável quando a função é criada. 
Qual é a utilidade do escopo léxico? Como uma função acessa sempre variáveis que estão no escopo em que ela foi definida, você pode criar funções do seguinte tipo:
counter <- function() {
  i <- 0
  function() {
    i <<- i + 1
    return(i)
  }
}
count <- counter()
count2 <- counter()
count()
[1] 1
count()
[1] 2
count()
[1] 3
count()
[1] 4
count2()
[1] 1
count2()
[1] 2
count()
[1] 5

No dia a dia, isso pode não ser útil, mas em alguns raros momentos você pode precisar criar funções que tenham comportamentos complexos como esse.
Um outro uso comum é criar funções do tipo generators, um exemplo é este aqui:
sampling_generator <- function(X_data, Y_data, size) {
  function() {
    rows <- sample(1:nrow(X_data), size, replace = TRUE)
    list(X_data[rows,], Y_data[rows,])
  }
}

Essa função retorna uma amostra aleatória diferente de X_data e Y_data cada vez que é chamada. Isso permite criar abstrações bem interessantes no seu código.
No R, também é possível modificar essas regras de escopo das funções. Modificar essas regras pode fazer com que a sua função seja mais simples de usar. As funções do dplyr fazem bastante uso disso, por exemplo quando escrevemos:
dplyr::mutate(mtcars, cyl = cyl * 2)

Neste caso, a regra do escopo léxico foi desrespeitada uma vez que a função não procurou a variável cyl no ambiente global, onde teria sido natural e sim dentro do mtcars. Esse código também não criou uma variável cyl dentro do ambiente global e sim dentro do mtcars. 
Neste caso, modificar a regra de escopo faz com que o usuário da função tenha que digitar muito menos o que pode ser bem útil quando estamos fazendo análise de dados.
Em resumo, na maioria dos casos, quando estamos usando funções definidas por outros desenvolvedores não precisamos nos preocupar com escopo léxico ou dinâmico. Na hora de criar pacotes ou funções que serão utilizadas por outras pessoas podemos pensar se queremos o escopo léxico ou modificar as regras de escopo para melhorar a API das funções. Também podemos abusar dessas regras de escopo para criar comportamentos mais avançados para as funções.

