EDIT: Hadley Wickham chỉ ra rằng tôi sai chính tả. R Kiểm tra CMD đang ném GHI CHÚ, không phải Cảnh báo. Tôi vô cùng xin lỗi vì sự nhầm lẫn. Đó là sự giám sát của tôi.
Phiên bản ngắn
R CMD check
ném ghi chú này mỗi khi tôi sử dụng cú pháp tạo cốt truyện hợp lý trong ggplot2:
no visible binding for global variable [variable name]
Tôi hiểu lý do tại sao kiểm tra R CMD làm điều đó, nhưng dường như nó đang hình sự hóa toàn bộ tĩnh mạch của cú pháp hợp lý. Tôi không chắc chắn những bước cần thực hiện để vượt qua gói hàng của mình R CMD check
và được nhận vào CRAN.
Bối cảnh
Sascha Epskamp trước đây được đăng trên cùng một vấn đề . Sự khác biệt, tôi nghĩ, đó subset()
là trang chủ của nó nói rằng nó được thiết kế để sử dụng tương tác .
Trong trường hợp của tôi, vấn đề không phải là kết thúc subset()
mà là một tính năng cốt lõi của ggplot2
: data =
đối số.
Một ví dụ về mã tôi viết tạo ra các ghi chú này
Đây là một chức năng phụ trong gói của tôi có thêm điểm vào một âm mưu:
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
, về phân tích mã này, sẽ nói
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
Tại sao kiểm tra R CMD là đúng
Kiểm tra là đúng kỹ thuật. x.values
vày.values
- Không được định nghĩa cục bộ trong hàm
JitteredResponsesByContrast()
- Không được xác định trước ở dạng
x.values <- [something]
toàn cầu hoặc trong người gọi.
Thay vào đó, chúng là các biến trong một khung dữ liệu được xác định trước đó và được truyền vào hàm JitteredResponsesByContrast()
.
Tại sao ggplot2 gây khó khăn cho việc xoa dịu kiểm tra R CMD
ggplot2 dường như khuyến khích việc sử dụng một data
đối số. Đối số dữ liệu, có lẽ là lý do tại sao mã này sẽ thực thi
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
nhưng này mã sẽ tạo ra một lỗi đối tượng-not-found:
library(ggplot2)
hwy # a variable in the mpg dataset
Hai công việc, và tại sao tôi không hạnh phúc
Chiến lược NULLing ra
Matthew Dowle khuyên bạn nên đặt các biến có vấn đề thành NULL trước, trong trường hợp của tôi sẽ như sau:
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))
)
)
}
Tôi đánh giá cao giải pháp này, nhưng tôi không thích nó vì ba lý do.
- nó không phục vụ mục đích bổ sung ngoài việc xoa dịu
R CMD check
. - nó không phản ánh ý định. Điều này đặt ra kỳ vọng rằng
aes()
cuộc gọi sẽ thấy các biến NULL hiện tại của chúng tôi (sẽ không), trong khi che khuất mục đích thực sự (làm cho R CMD kiểm tra nhận biết các biến mà dường như không biết là bị ràng buộc) - Các vấn đề của 1 và 2 nhân lên vì mỗi khi bạn viết một hàm trả về một phần tử cốt truyện, bạn phải thêm một câu lệnh NULLing khó hiểu
Chiến lược với ()
Bạn có thể sử dụng with()
để báo hiệu rõ ràng rằng các biến trong câu hỏi có thể được tìm thấy bên trong một số môi trường lớn hơn. Trong trường hợp của tôi, sử dụng with()
trông như thế này:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
Giải pháp này hoạt động. Nhưng, tôi không thích giải pháp này vì nó thậm chí không hoạt động theo cách tôi mong đợi. Nếu with()
đã thực sự giải quyết vấn đề của chỉ người phiên dịch đến nơi mà các biến là, sau đó tôi thậm chí không nên cần những data =
cuộc tranh cãi. Nhưng, with()
không hoạt động theo cách đó:
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
Vì vậy, một lần nữa, tôi nghĩ giải pháp này có những sai sót tương tự với chiến lược NULLing:
- Tôi vẫn phải trải qua mọi chức năng của phần tử cốt truyện và gói logic trong một
with()
cuộc gọi - Cuộc
with()
gọi là sai lệch. Tôi vẫn cần cung cấp mộtdata =
lập luận; tất cảwith()
đang làm là hấp dẫnR CMD check
.
Phần kết luận
Theo cách tôi thấy, có ba lựa chọn tôi có thể thực hiện:
- Hành lang CRAN để bỏ qua các ghi chú bằng cách lập luận rằng chúng là "giả" (theo chính sách CRAN ) và làm điều đó mỗi khi tôi gửi gói
- Sửa mã của tôi bằng một trong hai chiến lược không mong muốn (NULLing hoặc
with()
khối) - Hum thực sự lớn tiếng và hy vọng vấn đề biến mất
Không ai trong số ba người làm tôi hạnh phúc, và tôi tự hỏi mọi người đề nghị tôi (và các nhà phát triển gói khác muốn khai thác vào ggplot2) nên làm gì. Cảm ơn tất cả trước. Tôi thực sự đánh giá cao việc bạn thậm chí đọc qua điều này :-)
aes_string
transform
và subset
quá (không chắc chắn 100%, nhưng nó có ý nghĩa).