Edição: Hadley Wickham salienta que eu falhei errado. A verificação do CMD está lançando NOTAS, não avisos. Sinto muito pela confusão. Foi a minha supervisão.
A versão curta
R CMD check
lança essa nota toda vez que uso a sintaxe de criação de plotagem sensível no ggplot2:
no visible binding for global variable [variable name]
Entendo por que o R CMD check faz isso, mas parece estar criminalizando toda uma veia de sintaxe sensível. Não tenho certeza de que medidas tomar para que meu pacote seja aprovado R CMD check
e seja admitido no CRAN.
O fundo
Sascha Epskamp postou anteriormente sobre o mesmo problema . A diferença, eu acho, é que subset()
a página de manual diz que foi projetada para uso interativo .
No meu caso, a questão ainda não acabou, subset()
mas sobre um recurso principal de ggplot2
: the data =
argument.
Um exemplo de código que escrevo que gera essas notas
Aqui está uma subfunção no meu pacote que adiciona pontos a um gráfico:
JitteredResponsesByContrast <- function (data) {
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
R CMD check
, ao analisar esse código, dirá
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
Por que a verificação R CMD está certa
A verificação está tecnicamente correta. x.values
ey.values
- Não estão definidos localmente na função
JitteredResponsesByContrast()
- Não são predefinidos no formulário
x.values <- [something]
globalmente ou no chamador.
Em vez disso, são variáveis dentro de um quadro de dados definido anteriormente e passado para a função JitteredResponsesByContrast()
.
Por que o ggplot2 dificulta apaziguar a verificação do R CMD
O ggplot2 parece incentivar o uso de um data
argumento. O argumento de dados, presumivelmente, é o motivo pelo qual esse código será executado
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
mas esse código produzirá um erro de objeto não encontrado:
library(ggplot2)
hwy # a variable in the mpg dataset
Duas soluções alternativas e por que eu estou feliz com nenhuma das duas
A estratégia NULLing out
Matthew Dowle recomenda definir as variáveis problemáticas como NULL primeiro, que no meu caso seriam assim:
JitteredResponsesByContrast <- function (data) {
x.values <- y.values <- NULL # Setting the variables to NULL first
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
Aprecio esta solução, mas não gosto por três razões.
- não serve a nenhum propósito adicional além de apaziguador
R CMD check
. - não reflete intenção. Isso aumenta a expectativa de que a
aes()
chamada veja nossas variáveis agora NULL (não verá), enquanto obscurece o objetivo real (fazendo com que o R CMD verifique as variáveis que aparentemente não saberia que estavam vinculadas) - Os problemas de 1 e 2 se multiplicam porque toda vez que você escreve uma função que retorna um elemento de plotagem, é necessário adicionar uma instrução NULLing confusa
A estratégia with ()
Você pode usar with()
para sinalizar explicitamente que as variáveis em questão podem ser encontradas dentro de um ambiente maior. No meu caso, usar with()
esta aparência:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
Esta solução funciona. Mas não gosto dessa solução porque ela nem funciona da maneira que eu esperava. Se with()
realmente estivesse resolvendo o problema de apontar o intérprete para onde estão as variáveis, eu nem precisaria do data =
argumento. Mas, with()
não funciona assim:
library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found
Então, novamente, acho que essa solução tem falhas semelhantes à estratégia NULLing:
- Eu ainda tenho que passar por todas as funções do elemento plot e envolver a lógica em uma
with()
chamada - A
with()
ligação é enganosa. Eu ainda preciso fornecer umdata =
argumento; tudo o quewith()
está fazendo é apaziguadorR CMD check
.
Conclusão
Na minha opinião, há três opções que eu poderia tomar:
- Faça lobby no CRAN para ignorar as notas argumentando que elas são "falsas" (de acordo com a política do CRAN ) e faça isso toda vez que eu enviar um pacote
- Corrija meu código com uma das duas estratégias indesejáveis (NULLing ou
with()
blocos) - Zumbido muito alto e espero que o problema desapareça
Nenhum dos três me deixa feliz, e estou me perguntando o que as pessoas sugerem que eu (e outros desenvolvedores de pacotes que desejam explorar o ggplot2) devam fazer. Agradecemos antecipadamente a todos. Eu realmente aprecio a sua leitura mesmo através disso :-)
aes_string
transform
e subset
também (não 100% de certeza, mas faz sentido).