EDIT: Hadley Wickham menunjukkan bahwa saya salah bicara. Pemeriksaan R CMD melempar CATATAN, bukan Peringatan. Saya sangat menyesal atas kebingungan ini. Itu pengawasan saya.
Versi singkat
R CMD check
melempar catatan ini setiap kali saya menggunakan sintaks pembuatan-plot yang masuk akal di ggplot2:
no visible binding for global variable [variable name]
Saya mengerti mengapa pemeriksaan R CMD melakukan itu, tetapi tampaknya mengkriminalkan seluruh uraian sintaks yang masuk akal. Saya tidak yakin langkah apa yang harus diambil untuk mendapatkan paket saya untuk lulus R CMD check
dan diterima ke CRAN.
Latar belakang
Sascha Epskamp sebelumnya diposting pada dasarnya masalah yang sama . Perbedaannya, saya pikir, adalah bahwa subset()
halaman manual mengatakan itu dirancang untuk penggunaan interaktif .
Dalam kasus saya, masalahnya belum selesai subset()
tetapi lebih pada fitur inti ggplot2
: data =
argumen.
Contoh kode yang saya tulis yang menghasilkan catatan ini
Berikut adalah sub-fungsi dalam paket saya yang menambahkan poin ke plot:
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
, pada penguraian kode ini, akan mengatakan
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
Mengapa pemeriksaan R CMD benar
Secara teknis pemeriksaannya benar. x.values
dany.values
- Tidak didefinisikan secara lokal dalam fungsi
JitteredResponsesByContrast()
- Tidak ditentukan sebelumnya dalam bentuk
x.values <- [something]
baik secara global maupun dalam penelepon.
Sebagai gantinya, mereka variabel dalam kerangka data yang didefinisikan sebelumnya dan diteruskan ke fungsi JitteredResponsesByContrast()
.
Mengapa ggplot2 membuatnya sulit untuk menenangkan pemeriksaan CMD R
ggplot2 tampaknya mendorong penggunaan data
argumen. Argumen data, mungkin, adalah alasan mengapa kode ini akan dieksekusi
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
tetapi kode ini akan menghasilkan kesalahan objek-tidak-ditemukan:
library(ggplot2)
hwy # a variable in the mpg dataset
Dua solusi, dan mengapa saya tidak senang dengan keduanya
Strategi NULLing out
Matthew Dowle merekomendasikan pengaturan variabel bermasalah ke NULL terlebih dahulu, yang dalam kasus saya akan terlihat seperti ini:
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))
)
)
}
Saya menghargai solusi ini, tetapi saya tidak menyukainya karena tiga alasan.
- tidak ada tujuan tambahan selain memenuhi tuntutan
R CMD check
. - itu tidak mencerminkan niat. Ini menimbulkan harapan bahwa
aes()
panggilan akan melihat variabel sekarang-NULL kami (tidak akan), sementara mengaburkan tujuan sebenarnya (membuat R CMD memeriksa variabel yang tampaknya tidak akan diketahui terikat) - Masalah 1 dan 2 berlipat ganda karena setiap kali Anda menulis fungsi yang mengembalikan elemen plot, Anda harus menambahkan pernyataan NULLing yang membingungkan
Strategi with ()
Anda dapat menggunakan with()
untuk secara eksplisit memberi sinyal bahwa variabel yang dimaksud dapat ditemukan di dalam beberapa lingkungan yang lebih besar. Dalam kasus saya, menggunakan with()
terlihat seperti ini:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
Solusi ini berfungsi. Tapi, saya tidak suka solusi ini karena bahkan tidak berfungsi seperti yang saya harapkan. Jika with()
benar-benar memecahkan masalah menunjuk juru ke tempat variabel, maka saya seharusnya tidak perlu yang data =
argumen. Tetapi, with()
tidak berfungsi seperti itu:
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
Jadi, sekali lagi, saya pikir solusi ini memiliki kelemahan yang mirip dengan strategi NULLing:
- Saya masih harus melalui setiap fungsi elemen plot dan membungkus logika dalam
with()
panggilan - The
with()
panggilan menyesatkan. Saya masih perlu memberikandata =
argumen; semuawith()
lakukan adalah memenuhi tuntutanR CMD check
.
Kesimpulan
Cara saya melihatnya, ada tiga opsi yang bisa saya ambil:
- Lobi CRAN untuk mengabaikan catatan dengan alasan bahwa mereka "palsu" (sesuai dengan kebijakan CRAN ), dan lakukan itu setiap kali saya mengirimkan paket
- Perbaiki kode saya dengan salah satu dari dua strategi yang tidak diinginkan (NULLing atau
with()
blokir) - Bersenandung sangat keras dan berharap masalah hilang
Tidak satu pun dari ketiganya yang membuat saya bahagia, dan saya bertanya-tanya apa yang orang sarankan saya (dan pengembang paket lain yang ingin memanfaatkan ggplot2) harus lakukan. Terima kasih untuk semuanya. Saya sangat menghargai Anda membaca ini :-)
aes_string
transform
dan subset
juga (tidak 100% yakin, tetapi masuk akal).