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
dansubset
juga (tidak 100% yakin, tetapi masuk akal).Jawaban:
Apakah Anda mencoba dengan
aes_string
bukanaes
? Ini seharusnya bekerja, walaupun saya belum mencobanya:sumber
aes
tidak sementaraaes_string
tidak mendefinisikan parameter posisix
dany
.aes_string
mengatakan: "Semua fungsi ini sudah tidak digunakan lagi. Silakan gunakan idiom evaluasi yang rapi (lihat bagian kuasiquotasi dalam dokumentasi aes ())." (ggplot2 versi 3.2.1). Itu mungkin membuatrlang::.data
kandidat terbaik untuk membungkam catatan ini.Anda memiliki dua solusi:
Tulis ulang kode Anda untuk menghindari evaluasi yang tidak standar. Untuk ggplot2, ini berarti menggunakan
aes_string()
alih-alihaes()
(seperti dijelaskan oleh Harlan)Tambahkan panggilan ke
globalVariables(c("x.values", "y.values"))
suatu tempat di tingkat atas paket Anda.Anda harus berusaha untuk 0 CATATAN dalam paket Anda ketika mengirimkan ke CRAN, bahkan jika Anda harus melakukan sesuatu yang sedikit peretasan. Ini membuat hidup lebih mudah bagi CRAN, dan lebih mudah bagi Anda.
(Diperbarui 2014-12-31 untuk mencerminkan pemikiran terakhir saya tentang ini)
sumber
globalVariables
adalah hack yang mengerikan dan saya tidak akan pernah menggunakannya.ggplot
dandata.table
, dan dengan demikian memiliki banyak peringatan ini, yang membuat saya tidak memperhatikan peringatan lain yang lebih penting yang benar-benar masalah yang perlu saya perbaiki.ggplot::scale_dualAxis.sqrt
dan grafik pai 3D dengan pola isian.Pertanyaan ini telah ditanyakan dan dijawab beberapa waktu lalu tetapi hanya untuk informasi Anda, karena versi 2.1.0 ada cara lain untuk menyiasati catatan:
aes_(x=~x.values,y=~y.values).
sumber
Jika
Anda dapat menambahkan panggilan di tingkat atas paket:
dari:
sumber
x.values
dany.values
, jadi saya harus mendaftarkan SEMUA dari mereka.suppressForeignCheck
itu yang digunakan untukzzz.R
file./R/
. Misalnya, github.com/HughParsonage/grattan/blob/master/R/zzz.RPada 2019, cara terbaik untuk menyiasatinya adalah dengan menggunakan
.data
awalan darirlang
paket. Ini memberitahu R untuk memperlakukanx.values
dany.values
sebagai kolom dalamdata.frame
(sehingga tidak akan mengeluh tentang variabel yang tidak ditentukan).Catatan: Ini berfungsi paling baik jika Anda memiliki nama kolom yang telah ditentukan sebelumnya yang Anda tahu akan ada di input data Anda
sumber
Tambahkan baris kode ini ke file di mana Anda memberikan dokumentasi tingkat paket:
Contoh di sini
sumber