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
esubset
também (não 100% de certeza, mas faz sentido).Respostas:
Você já tentou com em
aes_string
vez deaes
? Isso deve funcionar, embora eu não tenha tentado:fonte
aes
o whileaes_string
não define parâmetros posicionaisx
ey
.aes_string
tiver mais votos) deva ser atualizada, pois a documentação diz: "Todas essas funções são reprovadas por software. Por favor, use expressões idiomáticas de avaliação (consulte a seção de quase-cotação na documentação de aes ())." (ggplot2 versão 3.2.1). Isso provavelmente érlang::.data
o melhor candidato para silenciar essas anotações.Você tem duas soluções:
Reescreva seu código para evitar uma avaliação não padrão. Para ggplot2, isso significa usar em
aes_string()
vez deaes()
(como descrito por Harlan)Adicione uma chamada para
globalVariables(c("x.values", "y.values"))
algum lugar no nível superior do seu pacote.Você deve se esforçar para obter 0 NOTAS no seu pacote ao enviar para o CRAN, mesmo se tiver que fazer algo ligeiramente hacky. Isso facilita a vida do CRAN e de você.
(Atualizado em 31/12/2014 para refletir meus pensamentos mais recentes sobre isso)
fonte
globalVariables
é um truque hediondo e eu nunca vou usá-lo.ggplot
edata.table
, e, portanto, toneladas de estas advertências, que me impediam de perceber outros avisos mais importantes que realmente eram problemas que eu precisava para correção.ggplot::scale_dualAxis.sqrt
gráficos de pizza 3D com padrões de preenchimento.Esta pergunta foi feita e respondida há um tempo, mas apenas para sua informação, desde a versão 2.1.0 existe outra maneira de contornar as notas:
aes_(x=~x.values,y=~y.values).
fonte
E se
Você pode adicionar uma chamada no nível superior do pacote:
de:
fonte
x.values
ey.values
, portanto, teria que registrar TODAS.suppressForeignCheck
é usado parazzz.R
arquivo./R/
. Por exemplo, github.com/HughParsonage/grattan/blob/master/R/zzz.REm 2019, a melhor maneira de contornar isso é usar o
.data
prefixo dorlang
pacote. Isso diz ao R para tratarx.values
ey.values
como colunas em umdata.frame
(para não reclamar de variáveis indefinidas).Nota: Isso funciona melhor se você tiver nomes de colunas predefinidos que você sabe que existirão na entrada de dados
fonte
Adicione esta linha de código ao arquivo no qual você fornece a documentação no nível do pacote:
Exemplo aqui
fonte