EDIT: Hadley Wickham benim yanlış yazdığım işaret ediyor. R CMD kontrolü Uyarılar değil, NOTLAR atıyor. Karışıklık için çok üzgünüm. Bu benim gözetimimdi.
Kısa versiyon
R CMD check
ggplot2'de mantıklı arsa oluşturma sözdizimini her kullandığımda bu notu atar :
no visible binding for global variable [variable name]
R CMD kontrolünün neden bunu yaptığını anlıyorum, ancak aksi takdirde mantıklı bir sözdiziminin tüm damarını kriminalize ediyor gibi görünüyor. Paketimin geçmesi R CMD check
ve CRAN'a kabul edilmesi için hangi adımların atılacağından emin değilim .
Arkaplan
Sascha Epskamp daha önce de aynı konuyu paylaşmıştı . Fark, bence, bu subset()
adamın sayfası interaktif kullanım için tasarlandığını söylüyor .
Benim durumumda, mesele bitmedi subset()
ama bir çekirdek özelliğin üzerine ggplot2
: data =
argüman.
Ben bu notları üreten kod örneği
İşte bir alt fonksiyonu içinde benim pakete bir arsa puan ekler:
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
, bu kodu ayrıştırırken,
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
R CMD kontrolü neden doğru?
Kontrol teknik olarak doğrudur. x.values
vey.values
- İşlevde yerel olarak tanımlanmamış
JitteredResponsesByContrast()
- Formda
x.values <- [something]
küresel olarak veya arayan kişi için önceden tanımlanmamıştır .
Bunun yerine, daha önce tanımlanıp işleve iletilen bir veri çerçevesi içindeki değişkenlerdir JitteredResponsesByContrast()
.
Ggplot2 neden R CMD kontrolünü hafifletmeyi zorlaştırıyor
ggplot2 bir data
argümanın kullanılmasını teşvik ediyor gibi görünmektedir . Veri argümanı, muhtemelen, bu kodun neden yürütüleceğidir
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
ancak bu kod, nesne bulunamadı hatası verir:
library(ggplot2)
hwy # a variable in the mpg dataset
İki çözüm ve neden ikisinden de memnun değilim
NULLing out stratejisi
Matthew Dowle sorunlu değişkenleri önce NULL olarak ayarlamanızı önerir , bu benim durumumda şöyle görünecektir:
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))
)
)
}
Bu çözümü takdir ediyorum, ancak üç nedenden dolayı beğenmedim.
- başvurmaktan başka ek bir amaca hizmet etmiyor
R CMD check
. - niyeti yansıtmaz.
aes()
Gerçek amacı gizlerken çağrının şimdi NULL değişkenlerimizi göreceği beklentisini arttırıyor (olmayacak) (R CMD'nin başka türlü bağlı olduğunu bilmediği değişkenlerin farkına varmasını kontrol etmek) - 1 ve 2'nin sorunları çoğalır, çünkü bir çizim öğesi döndüren bir işlev her yazışınızda, kafa karıştırıcı bir NULLing ifadesi eklemeniz gerekir
With () stratejisi
Söz with()
konusu değişkenlerin daha büyük bir ortamda bulunabileceğini açıkça belirtmek için kullanabilirsiniz . Benim durumumda, kullanma with()
şöyle görünür:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
Bu çözüm işe yarıyor. Ancak, bu çözümü sevmiyorum çünkü beklediğim gibi bile çalışmıyor. Eğer with()
gerçekten değişkenler olduğu yere tercüman işaret sorununu çözme, sonra ben bile olmamalıdır gerekdata =
argüman. Ancak, with()
bu şekilde çalışmaz:
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
Yani, yine, bu çözümün NULLing stratejisine benzer kusurları olduğunu düşünüyorum:
- Hala her komplo elemanı işlevinden geçip mantığı bir
with()
çağrıya sarmam gerekiyor with()
Çağrı yanıltıcıdır. Hala birdata =
argüman sunmam gerekiyor; herwith()
şey çekiciR CMD check
.
Sonuç
Gördüğüm gibi, alabileceğim üç seçenek var:
- Lobi CRAN ( CRAN politikası uyarınca) "sahte" olduğunu iddia ederek notları görmezden gelmek ve bunu her paket gönderdiğimde yapmak
- Kodumu istenmeyen iki stratejiden biriyle düzeltin (NULL veya
with()
bloklar) - Gerçekten yüksek sesle uğultu ve umarım problem gider
Üçünün hiçbiri beni mutlu etmiyor ve insanların ne önerdiğini merak ediyorum (ve ggplot2'ye girmek isteyen diğer paket geliştiricileri) yapmalı. Şimdiden teşekkürler. Bu okumayı gerçekten takdir ediyorum :-)
aes_string
transform
ve subset
çok (emin değilim% 100, ama mantıklı).