SORU
24 ŞUBAT 2012, Cuma


Nasıl kontrol "global değişken" için görünür bir cilt; ggplot2 benim sözdizimi mantıklı olduğunda notlar CMD R işleyebilir miyim?

EDİT: Hadley Wickham kendimi yanlış ifade ettim dikkat çekiyor. R CMD kontrol NOTLARI, Uyarıları veriyor. Karışıklık için çok özür dilerim. Benim yanlışlık.

Kısa versiyonu

R CMD check Bu ggplot2 sensible plot-creation syntax her kullanışımda not atar:

no visible binding for global variable [variable name]

R CMD kontrol, ama başka mantıklı sözdizimi bütün bir damar suç gibi görünüyor anlıyorum. Benim paket R CMD check pas ve kabul almak için KURABİYELERLE almak için ne olduğundan emin değilim.

Arka plan

Sascha Epskamp daha önce essentially the same issue tarihinde gönderildi. Fark, sanırım, subset()'says it's designed for interactive use s kılavuz.

Benim durumumda, sorun ggplot2 temel bir özelliği üzerinde subset() değil ama: data = argüman.

Bu notlar oluşturduğu yazdığım kod bir örnek

Burada bir arsa için puan ekler a sub-function my package:

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 kod ayrıştırma, diyecekler

granovagg.contr : JitteredResponsesByContrast: no visible binding for
  global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
  global variable 'y.values'

Onay CMD neden haklı

Onay teknik olarak doğru. x.values y.values

  • Yerel işlevi tanımlı değil 20**
  • Formu x.values <- [something] ya da genel olarak ön tanımlı değil ya da arayan.

Bunun yerine, daha önce tanımlanmış ve işlevi JitteredResponsesByContrast() içine geçirilen bir dataframe içinde değişkenleri ediyorlar.

Zor R CMD yatıştırmak için yapar neden kontrol edin

ggplot2 data bir değişken kullanımını teşvik etmek gibi görünüyor. Veri bağımsız değişkeni, muhtemelen, bu kod yürütmesine neden olur

library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p   geom_point()

amabukod nesne-not-found hatası: bir üretecek

library(ggplot2)
hwy # a variable in the mpg dataset

İki aptal bir iş, neden ve ne ile mutluyum

NULLing çıkış stratejisi

Matthew Dowle recommends sorunlu değişkenleri benim durumumda bu gibi görünecektir ilk, NULL ayarı:

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, ama üç nedenden dolayı sevmiyorum.

  1. R CMD check yatıştırıcı ötesinde ek bir amaca hizmet eder.
  2. niyeti göstermez. Yükseltir beklentisi olan aes() arayacak görmek bizim artık BOŞ değişkenler (olmaz), süre engelleyen gerçek amaç (R CMD onay farkında değişkenleri görünüşe göre olmaz yoksa biliyorum bağlı)
  3. 1 ve 2 problemleri her zaman bir komplo öğe döndüren bir fonksiyon yazmak için, kafa karıştırıcı NULLing bir açıklama eklemek zorunda çarpın

() İle strateji

with() söz konusu değişkenler biraz daha büyük bir ortam içinde bulunabilir açıkça işaret etmek için kullanabilirsiniz. Benim durumumda, with() kullanarak bu gibi görünüyor:

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 çalışır. Ama, bile beklenir bu şekilde olmuyor çünkü bu çözüm sevmiyorum. Eğer with() çok değişken olduğu için tercüman işaret sorununu çözmek olsaydı, o zaman bile etmemeliyimgerekdata = argüman. , with() ama bu şekilde çalışmıyor:

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 NULLing stratejisine benzer bir kusuru var bence

  1. Ben hala her çizim öğesi işlevi geçmesi ve with() telefon mantık sarın
  2. with() çağrı yanıltıcıdır. Ben hala data = bir argümanın with() yaptığı R CMD check yatıştırmak.

Sonuç

Gördüğüm kadarıyla, alırım üç seçenek vardır:

  1. Lobi" (**51) uyarınca, ve her zaman ben bir paket gönder. "sahte olduğunu savunarak notları görmezden KIZIL
  2. İki istenmeyen stratejileri ile benim kod (NULLing ya with() blok) düzeltme
  3. Uğultu yüksek sesle ve sorun ortadan kalkar umarım gerçekten

Üç hiçbiri beni mutlu ediyor, ve insanlar ve diğer paket geliştiriciler ggplot2 dünyasına giriş yapmak isteyen kişiler) nedir merak ediyorum. Şimdiden herkese teşekkürler. Ben gerçekten bu işten bile okuma takdir :-)

CEVAP
14 EYLÜL 2012, Cuma


İki çözüm var:

  • Kodunuz standart dışı değerlendirme önlemek için yeniden yazın. Ggplot2, bu demektir aes() yerine aes_string() kullanarak Harlan tarafından açıklandığı gibi)

  • Bir ara 44 ** bir yere üst düzey paket için ekleyin.

Eğer bir şey biraz hacky yapacaksan bile KURABİYELERLE için gönderirken paketinize 0 NOTLAR için gayret etmelisiniz. Bu hayat KURABİYELERLE için daha kolay ve sizin için daha kolay hale getirir.

(2014-12-31 bu son düşüncelerimi yansıtacak şekilde güncellendi)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Huot Media

    Huot Media

    7 Mayıs 2010
  • Mindy

    Mindy

    20 NİSAN 2006
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009