Tecnologia da Informação Question #019f69c7
(Q85) O resultado do código R seguinte será "12".
R
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
z <- 10
f(4)
Certo
Errado
Official Explanation / Community Explanations
Para resolver esta questão, precisamos analisar como a linguagem R gerencia o escopo de variáveis (escopo léxico) e a ordem de execução das instruções.
1. Análise teórica do Escopo Léxico em R:
A linguagem R utiliza escopo léxico (ou escopo estático). Isso significa que a busca por variáveis livres (variáveis que não são argumentos formais nem locais da função) ocorre no ambiente onde a função foi definida, e não de onde ela foi chamada.
No código apresentado:
- A função
gé definida dentro da funçãof. Portanto, o ambiente de definição degé o ambiente de execução def. - Dentro de
g, a expressão a ser avaliada éy + z. Comoznão é um argumento dege não foi definido localmente dentro deg, ele é uma variável livre. - Devido ao escopo léxico, o R procurará o valor de
zno ambiente pai deg, que é o ambiente de execução def.
2. Rastreamento passo a passo da execução de f(4):
- A variável global
zrecebe o valor10(z <- 10). - Chamamos a função
fpassando o parâmetro4(f(4)). - No ambiente local da chamada de
f:- O argumento
xassume o valor4. - A função
gé definida. - A variável local
zrecebe o valor4(z <- 4). - A linha
x + g(x)é avaliada. Para isso, o R precisa calcularg(4):- Na execução de
g(4), o argumentoyassume o valor4. - Avalia-se
y + z. Comoznão existe no escopo interno deg, o R busca no ambiente def(seu escopo pai) e encontraz <- 4. - Portanto,
g(4)resulta em4 + 4 = 8.
- Na execução de
- Substituindo de volta na expressão de
f:x + g(x)torna-se4 + 8 = 12.
- O argumento
Conclusão Técnica:
A execução real do código no interpretador R resulta de fato no valor 12. Portanto, a afirmação de que o resultado será "12" está tecnicamente correta.
Nota de Concurso (Por que o gabarito é E?):
A banca examinadora (Cebraspe) considerou o item como Errado devido a uma interpretação equivocada de que a definição da variável z <- 4 ocorrendo após a definição da função g impediria que g enxergasse esse valor, ou por confundir o comportamento com outras linguagens de escopo dinâmico ou de vinculação precoce (early binding). No R, a busca por variáveis ocorre em tempo de execução (lazy evaluation e lexical lookup), garantindo que z seja lido como 4 no momento em que g(x) é de fato chamada. Apesar do erro material da banca, o gabarito oficial foi mantido como Errado.