Dấu chấm trong tên hàm có thể có nghĩa là bất kỳ điều nào sau đây:
- không có gì đâu
- dấu phân cách giữa phương thức và lớp trong các phương thức S3
- để ẩn tên hàm
Ý nghĩa có thể
1. Không có gì cả
Dấu chấm trong data.frame
không tách biệt data
với frame
, ngoài trực quan.
2. Tách các phương thức và lớp trong các phương thức S3
plot
là một ví dụ về phương pháp S3 chung. Do đó plot.lm
và plot.glm
là các định nghĩa hàm cơ bản được sử dụng khi gọi plot(lm(...))
hoặcplot(glm(...))
3. Để ẩn các chức năng bên trong
Khi viết các gói, đôi khi sử dụng các dấu chấm ở đầu trong tên hàm rất hữu ích vì các hàm này hơi bị ẩn khỏi chế độ xem chung. Các chức năng có nghĩa là hoàn toàn nội bộ của một gói đôi khi sử dụng điều này.
Trong ngữ cảnh này, "hơi bị ẩn" chỉ đơn giản có nghĩa là biến (hoặc hàm) thường sẽ không hiển thị khi bạn liệt kê đối tượng với ls()
. Để buộc ls
hiển thị các biến này, hãy sử dụng ls(all.names=TRUE)
. Bằng cách sử dụng dấu chấm làm chữ cái đầu tiên của một biến, bạn thay đổi phạm vi của chính biến đó. Ví dụ:
x <- 3
.x <- 4
ls()
[1] "x"
ls(all.names=TRUE)
[1] ".x" "x"
x
[1] 3
.x
[1] 4
4. Các lý do có thể khác
Trong Hadley's plyrgói, anh ta sử dụng quy ước sử dụng dấu chấm ở đầu trong tên hàm. Đây là một cơ chế để thử và đảm bảo rằng khi phân giải tên biến, các giá trị sẽ phân giải cho các biến người dùng chứ không phải các biến hàm nội bộ.
Các biến chứng
Việc trộn lẫn các mục đích sử dụng khác nhau này có thể dẫn đến các tình huống rất khó hiểu, bởi vì những mục đích sử dụng khác nhau này có thể bị trộn lẫn trong cùng một tên hàm.
Ví dụ: để chuyển đổi data.frame
một danh sách bạn sử dụngas.list(..)
as.list(iris)
Trong trường hợp as.list
này là một phương thức chung S3 và bạn đang chuyển một phương thức data.frame
cho nó. Do đó, hàm S3 được gọi là as.list.data.frame
:
> as.list.data.frame
function (x, ...)
{
x <- unclass(x)
attr(x, "row.names") <- NULL
x
}
<environment: namespace:base>
Và đối với một cái gì đó thực sự ngoạn mục, hãy tải data.table
gói và xem chức năng as.data.table.data.frame
:
> library(data.table)
> methods(as.data.table)
[1] as.data.table.data.frame* as.data.table.data.table* as.data.table.matrix*
Non-visible functions are asterisked
> data.table:::as.data.table.data.frame
function (x, keep.rownames = FALSE)
{
if (keep.rownames)
return(data.table(rn = rownames(x), x, keep.rownames = FALSE))
attr(x, "row.names") = .set_row_names(nrow(x))
class(x) = c("data.table", "data.frame")
x
}
<environment: namespace:data.table>
is.na
,as.data.frame
, ...) là không bình thường trong ngôn ngữ lập trình khác, nhưng tôi thích nó.