2011-11-11 4 views
34

Tôi nhận thấy trong việc kiểm tra gói mà tôi nhận được ghi chú "không nhìn thấy được ràng buộc cho biến toàn cầu" khi tôi sử dụng các hàm như subset sử dụng tên nguyên bản của các phần tử danh sách làm đối số.Không có ràng buộc có thể nhìn thấy đối với biến toàn cầu Lưu ý trong kiểm tra REX

Ví dụ với một khung dữ liệu:

foo < - data.frame (a = c (TRUE, FALSE, TRUE), b = 1: 3)

tôi có thể làm những điều ngớ ngẩn như:

subset(foo,a) 
transform(foo,a=b) 

Công việc như mong đợi. Việc kiểm tra mã R trong R CMD tuy nhiên không hiểu rằng những tham chiếu đến các yếu tố và than phiền về việc không có bất kỳ ràng buộc có thể nhìn thấy của các biến toàn cầu.

Trong khi điều này làm việc ok, tôi không thực sự thích có ghi chú trong gói của tôi và thích cho nó để vượt qua kiểm tra không có lỗi, cảnh báo và ghi chú cả. Tôi cũng không thực sự muốn viết lại mã của mình quá nhiều. Có cách nào để viết các mã này để nó rõ ràng các đối số không đề cập đến các biến toàn cầu?

+0

Điều này có thể có một số biện minh trong việc đưa ra các gói "có tính tổng hợp hơn" vì lợi ích của sự tiến hóa R trong tương lai ... – mbq

+0

Tôi lưu ý rằng câu hỏi này đã được nhân bản gần đây hơn: http://stackoverflow.com/questions/9439256/how-can -i-handle-r-cmd-check-no-visible-binding-cho-global-variable-notes-when nhưng các câu trả lời có furt thông tin của cô mà những người khác có thể thấy hữu ích. – cboettig

Trả lời

40

Để có được nó qua R CMD check bạn có thể:

  • Sử dụng get("b") (nhưng đó là lựa chọn hợp lý)
  • Nơi a=b=NULL đâu đó cao hơn trong chức năng của bạn (đó là những gì tôi làm)

Có một chủ đề trên r-devel một thời gian trước đây, nơi một người nào đó từ r-core về cơ bản nói (từ bộ nhớ) "LƯU Ý là ok, bạn biết. Giả định là tác giả đã kiểm tra nó và là ok với CHÚ Ý. " Nhưng, tôi đồng ý với bạn. Tôi thích có CRAN kiểm tra trở lại một "OK" sạch trên tất cả các nền tảng. Bằng cách đó, người dùng không được nghi ngờ rằng nó vượt qua kiểm tra ok.

EDIT:

Đây là r-devel thread Tôi đang nhớ (từ tháng Tư 2010). Vì vậy, điều đó dường như gợi ý rằng có một số tình huống mà không có cách nào để tránh CHÚ Ý, nhưng điều đó là ổn.

+0

Cảm ơn. Tôi sẽ sử dụng điều này cho đến khi tôi có thời gian để recode một cách thích hợp :) –

+1

Tôi không chắc chắn có một cách thích hợp;) Tôi nghĩ về điều 'a = b = NULL' giống như khai báo biến C. Nó làm cho tôi nghĩ một chút khó khăn hơn và đã bắt gặp một số lỗi cho tôi, vì vậy tôi không nhớ nó. –

+3

@MattDowle Có vẻ như đối diện với khai báo biến C, bởi vì nó nói với người dùng "đây là NULL" khi thực tế chức năng sẽ dựa vào chúng không phải là NULL như được truy cập. – tim

17

Đây là một trong những "hậu quả không lường trước" tiềm năng của việc sử dụng subset không tương tác. Như đã nói trong phần Cảnh báo của ?subset:

Đây là chức năng tiện lợi được sử dụng tương tác. Đối với chương trình , tốt hơn nên sử dụng các chức năng đặt giá thầu tiêu chuẩn như ‘[’ và đặc biệt là đánh giá phi tiêu chuẩn đối số ‘tập hợp con’ có thể có hậu quả không lường trước được.

+4

Hãy suy nghĩ câu hỏi có thể tổng quát hơn là 'tập con'. Tôi đã nhìn thấy nó một vài lần. –

+3

Đối với các chức năng mạnh mẽ, tránh các chức năng gọi điện sử dụng đánh giá không chuẩn. – hadley

+2

@hadley, nhưng những gì về các cuộc gọi đến 'foreach'? ... Những điều này vẫn kích động cùng một Lưu ý. – StevieP

9

Theo phần cảnh báo của ?subset thì tốt hơn nên sử dụng tập con tương tác và [ để lập trình.

tôi sẽ thay thế một lệnh như

subset(foo,a)

với

foo[foo$a]

hoặc nếu foo là một dataframe:

foo[foo$a, ]

bạn cũng có thể muốn sử dụng with nếu foo là một dataframe và sự biểu hiện được đánh giá là phức tạp:

with(foo, foo[a, ])

+0

Tôi chắc chắn 'with' sẽ gây ra cùng một vấn đề chính xác vì' a' vẫn chưa được xác định trong môi trường, chỉ trong dữ liệu. – BrodieG

11

Từ R phiên bản 2.15.1 trở đi có một khoảng cách này:

if(getRversion() >= "2.15.1") utils::globalVariables(c("a", "othervar")) 
+4

yikes .. đó là khá một tác dụng phụ chỉ để giả bộ phận con được đánh giá chính xác ... Hãy tốt đẹp nếu CRAN chỉ cho phép tác giả đánh dấu ghi chú về rõ ràng (nhưng không thực sự) thiếu globals như giả… – tim