Tecnologia da Informação
hard
Questão de Tecnologia da Informação #019f69c5
Enunciado da Questão
Tecnologia da Informação
#Agente
#Escopo Léxico
#Programação Funcional
#Policial
#2021
#Linguagem R
#PF
#Cebraspe
#Engenharia de Dados
Difícil
(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)
A
Certo
B
Errado
Correta
Explicação Oficial / Explicações da Comunidade
Esta questão exige o conhecimento sobre o escopo de variáveis (scoping rules) na linguagem R, especificamente o escopo léxico (lexical scoping).
Análise Técnica do Código (Passo a Passo)
-
Definição da função
f:
R
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}Aqui, a função
gé definida dentro do ambiente da funçãof. Portanto, o ambiente pai degé o ambiente de execução def. -
Definição da variável global
z:
R
z <- 10 -
Chamada da função
f(4):- O parâmetro
xassume o valor4dentro do ambiente local def. - A função interna
gé definida. - A variável
zé criada no ambiente local defcom o valor4(z <- 4). - A expressão
x + g(x)é avaliada. Comox = 4, temos4 + g(4).
- O parâmetro
-
Execução de
g(4):- O parâmetro
ydegassume o valor4. - A função
gtenta retornary + z(ou seja,4 + z). - Como
znão está definido dentro deg, o R utiliza o escopo léxico para buscar o valor dez. Ele procura no ambiente ondegfoi definida (que é o ambiente interno def). - No ambiente de
f, a variávelzexiste e vale4. - Portanto,
g(4)retorna4 + 4 = 8.
- O parâmetro
-
Resultado final de
f(4):- Retorna
x + g(x)→4 + 8 = 12.
- Retorna
Análise do Gabarito
- Na execução real do R: O resultado final do código é exatamente 12. Portanto, a afirmação de que "o resultado do código R seguinte será 12" está tecnicamente correta (Certo).
- Justificativa para o Gabarito Oficial "E" (Errado): A banca examinadora cometeu um equívoco conceitual comum. É provável que o examinador tenha pensado que:
- O R buscaria o valor de
zno escopo global (z <- 10), o que resultaria em4 + (4 + 10) = 18. - Ou que, como
z <- 4foi definido depois da declaração degdentro da funçãof, o R não encontraria a variável local e buscaria o valor global10. No R, contudo, a busca de valores ocorre em tempo de execução (lazy evaluation/dynamic lookup), e não de definição, fazendo com quez <- 4seja perfeitamente visível paragno momento de sua chamada.
- O R buscaria o valor de
Apesar do resultado real do código ser 12 (o que tornaria o item "Certo"), o gabarito oficial mantido pela banca foi E (Errado).