2017-06-23 22 views
12

Preambledplyr 0.7.0 tidyeval trong gói

Tôi thường sử dụng dplyr trong gói của tôi. Trước 0.7.0, tôi đã sử dụng các phiên bản chưa được nhấn mạnh của dplyr động từ để tránh LƯU Ý trong R CMD CHECK. Ví dụ, mã:

x <- tibble::tibble(v = 1:3, w = 2) 
y <- dplyr::filter(x, v > w) 

sẽ mang lại những R CMD CHECK LƯU Ý:

* checking R code for possible problems ... NOTE 
no visible binding for global variable ‘v’ 

Để so sánh, sử dụng phiên bản đánh giá tiêu chuẩn:

y <- dplyr::filter_(x, ~v > w) 

mang lại không Chú ý như vậy.

Tuy nhiên, trong dplyr 0.7.0, các họa tiết Programming with dplyr nói rằng cú pháp thích hợp cho bao gồm dplyr chức năng trong gói (để tránh ghi chú) là:

y <- dplyr::filter(x, .data$v > .data$w) 

Do đó, news file nói rằng "phiên bản nhấn của mỗi chính động từ không còn cần thiết nữa, và do đó các chức năng này đã không còn được dùng nữa (nhưng vẫn còn xung quanh cho khả năng tương thích ngược). "

Câu hỏi

Các họa tiết nói rằng cú pháp mới trên sẽ không mang lại R CMD check GHI CHÚ, "miễn là bạn cũng đã nhập rlang::.data với @importFrom rlang .data." Tuy nhiên, khi tôi chạy mã:

y <- dplyr::filter(x, rlang::.data$v > rlang::.data$w) 
Evaluation error: Object `From` not found in data. 

Lỗi này có tương tự như sau không?

y <- dplyr::filter(x, v == dplyr::n()) 
Evaluation error: This function should not be called directly. 

Cụ thể, đối với một số chức năng, hãy gọi chúng là tiền tố với gói mang lại lỗi? (Một cái gì đó để làm với có hay không họ đã được xuất khẩu, có lẽ?)

Comment

Là một sang một bên, là có một cách ít verbose viết gói thân thiện với dplyr chức năng với cú pháp mới trong 0,7.0? Đặc biệt, cú pháp cho dplyr >=0.7.0:

y <- dplyr::filter(x, .data$v > .data$w) 

nhiều tiết hơn so với cú pháp cho dplyr <0.7.0:

y <- dplyr::filter_(x, ~v > w) 

và tính cách rườm rà tăng lên khi biến hơn được tham chiếu. Tuy nhiên, tôi không muốn sử dụng cú pháp ít tiết hơn với phiên bản được nhấn mạnh vì nó không được chấp nhận.

Trả lời

3

đối với một số chức năng, gọi chúng là tiền tố với gói mang lại lỗi?

Đúng vậy, nhưng chúng tôi có thể làm cho chúng hoạt động để giúp mọi thứ dễ dự đoán hơn. Bạn có thể gửi một vấn đề github cho tính năng này.

có cách viết chi tiết hơn với các hàm dplyr thân thiện với gói bằng cú pháp mới trong 0.7.0 không?

Cách khác là khai báo tất cả các ký hiệu cột của bạn thành R, ví dụ: trong một tuyên bố globalVariables(c("v", "w")) ở đâu đó trong gói của bạn.

Lý tưởng nhất, R nên biết về các chức năng của NSE và không bao giờ cảnh báo các ký hiệu không xác định trong những trường hợp đó.

+0

Cảm ơn. Tôi có nên gửi vấn đề dưới 'dplyr' hoặc' rlang'? – AJP123

+0

bạn có thể nộp tại dplyr, vui lòng – lionel

+0

Hoàn tất. https://github.com/tidyverse/dplyr/issues/2930 – AJP123

2

Một công việc xung quanh là thêm dòng như

v <- NULL; # mark as not an unbound global reference 

ngay trên biểu thức của bạn đang tạo kiểm tra cran. Nó không kém chính xác (các tên cột không nằm trong các biến toàn cục thực tế) và có phạm vi giới hạn phần nào.