Ggplot2 sözdizimim mantıklı olduğunda R CMD kontrol “global değişken için görünür bağlanma yok” notlarını nasıl işleyebilirim?


180

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 checkggplot2'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 checkve 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.valuesvey.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 dataargü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.

  1. başvurmaktan başka ek bir amaca hizmet etmiyor R CMD check.
  2. 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)
  3. 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:

  1. Hala her komplo elemanı işlevinden geçip mantığı bir with()çağrıya sarmam gerekiyor
  2. with()Çağrı yanıltıcıdır. Hala bir data =argüman sunmam gerekiyor; her with()şey çekici R CMD check.

Sonuç

Gördüğüm gibi, alabileceğim üç seçenek var:

  1. Lobi CRAN ( CRAN politikası uyarınca) "sahte" olduğunu iddia ederek notları görmezden gelmek ve bunu her paket gönderdiğimde yapmak
  2. Kodumu istenmeyen iki stratejiden biriyle düzeltin (NULL veya with()bloklar)
  3. 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 :-)


20
# 1 ve # 3'ü seviyorum.
Ben Bolker

8
@ BenBolker da benim gitme tekniklerim.
hadley

6
4. bir seçenek var: 'R CMD kontrolünü' değiştirin ve r-devel'e değerlendirilmek üzere bir yama gönderin. Hangisinin sahte ve hangisinin olmadığını tespit etmenin oldukça zor (ve muhtemelen imkansız) bulacağından şüpheleniyorum. Herkes bunu yapmak için bir kod parçası ile geldi, o zaman ...
Matt Dowle

6
Başka bir strateji kullanmakaes_string
hadley

2
Bu sorun gibi görünüyor transformve subsetçok (emin değilim% 100, ama mantıklı).
BrodieG

Yanıtlar:


45

Birlikte denediniz aes_stringyerine aes? Ben denemedim rağmen bu çalışması gerekir:

aes_string(x = 'x.values', y = 'y.values')

4
sadece bir uyarı: aeswhile ise aes_stringkonumsal parametreleri tanımlamaz xve y.
topchef

6
Bir uyarı daha. aes_string, x ve y değerlerini değiştirmek için işlevleri kullanmanıza izin vermez. Dönüşüm y'yi günlüğe kaydetmek istediğinizi varsayalım, bu durumda aes_string (x = 'x.values', y = 'log (y.values)') elbette işe yaramaz. Bu tür dönüşümleri kendim çok kullanıyorum, bu yüzden aes_string her zaman benim için bir seçenek değil.
Dr. Mike

Belki de bu cevap (ve en çok oyu alan), aes_string"Tüm bu işlevler yumuşak kullanımdan kaldırılmıştır. Lütfen bunun yerine düzenli değerlendirme deyimleri kullanın (aes () belgelerindeki nicelik bölümüne bakın)" ifadesinin belgelerinden dolayı güncellenmelidir. (ggplot2 sürüm 3.2.1). Bu muhtemelen rlang::.databu notları susturmak için en iyi adayı yapar .
Vandenman

86

İki çözümünüz var:

  • Standart dışı değerlendirmeden kaçınmak için kodunuzu yeniden yazın. Ggplot2 için, aes_string()bunun yerine aes()(Harlan tarafından açıklandığı gibi)

  • globalVariables(c("x.values", "y.values"))Paketinizin üst düzeyindeki bir yere çağrı ekleyin .

CRAN'a gönderirken, biraz hacky bir şey yapmak zorunda olsanız bile, paketinizde 0 NOT için çaba göstermelisiniz. Bu CRAN için hayatı kolaylaştırır ve sizin için daha kolay hale getirir.

(Bu konudaki son düşüncelerimi yansıtmak için 2014-12-31 güncellendi)


26
globalVariablesiğrenç bir hack ve asla kullanmayacağım.
hadley

10
Değer için, bu notlar nedeniyle paket gönderimi reddedildi ve utils :: globalVariables işlevini kullanması söylendi. Tartışacak bir konumda olmadığım için yaptığım da buydu.
jbryer

9
Ben bunları göz ardı etmek en iyisi olacağını kabul ediyorum, ama benim kod kullanımları çok ggplotve data.tableve böylece vardır ton gerçekten düzeltme için gereken sorunlar vardı diğer daha önemli uyarılar fark beni tutmuş bu uyarıları ait.
Ken Williams

108
@hadley, sadece iki yıl sonra iyi olduğunu düşündüğünüzde asla bir şey kullanmayacağınızı söylememelisiniz
Hadley

10
yeni yıl kararı? Gözlerimi açık tutacağım ggplot::scale_dualAxis.sqrtve doldurma desenleri ile 3D pasta grafikler.
baptiste


12

Eğer

getRversion() >= "3.1.0"

Paketin en üst düzeyinde bir çağrı ekleyebilirsiniz:

utils::suppressForeignCheck(c("x.values", "y.values"))

dan:

help("suppressForeignCheck")

3
Bu adil bir çözüm. Teşekkürler! Bunu düşünmüştüm, ama sorun şu ki çok sayıda değişkenim var x.valuesve y.valuesbu yüzden TÜMÜNÜ kaydetmeliydim.
briandk

4
Ne suppressForeignCheckiçin kullanılır
hadley

10
Aslında en üst seviye nerede ? Bu komutu hangi dosyaya eklerim?
drmariod

9
Özel olarak, bu bir zzz.Rdosyaya konur ./R/. Örneğin, github.com/HughParsonage/grattan/blob/master/R/zzz.R
Hugh

6
@hadley, ne için kullanılır? help ("suppressForeignCheck") "çalışma zamanı hesaplanmış yerel sembol" için olduğunu ima ediyor gibi görünüyor, ama bu da ne?
pdb

8

2019'da, bunu çözmenin en iyi yolu paketin .dataönekini kullanmaktır rlang. Bu, R'ye a x.valuesve y.valuessütunları olarak davranmasını söyler data.frame(böylece tanımlanmamış değişkenlerden şikayet etmez).

Not: Bu, veri girişinizde olacağını bildiğiniz önceden tanımlanmış sütun adlarınız varsa en iyi sonucu verir

#' @importFrom rlang .data
my_func <- function(data) {
    ggplot(data, aes(x = .data$x, y = .data$y))
}

3

Bu kod satırını, paket düzeyinde belgeler sağladığınız dosyaya ekleyin:

if(getRversion() >= "2.15.1")  utils::globalVariables(c("."))

Burada örnek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.