R的意思是什么? – 个人喜好,命名规则还是更多?

我(可能)没有提到“所有其他variables”,就像var1~. 这里。 我又一次被指向plyr ,看着mlply ,想知道为什么参数是用像这样的前导点来定义的:

 function (.data, .fun = NULL, ..., .expand = TRUE, .progress = "none", .parallel = FALSE) { if (is.matrix(.data) & !is.list(.data)) .data <- .matrix_to_df(.data) f <- splat(.fun) alply(.data = .data, .margins = 1, .fun = f, ..., .expand = .expand, .progress = .progress, .parallel = .parallel) } <environment: namespace:plyr> 

那有什么用? 这只是个人喜好,命名规则还是更多? 通常R是如此的function,以至于我错过了一个很久以前就已经完成的技巧。

函数名称中的一个点可以表示以下任何一个:

  • 一无所有
  • S3方法中的方法和类之间的分隔符
  • 隐藏函数名称

可能的意思

1.什么都没有

data.frame中的点不会将dataframe分开,除了可视化之外。

2.在S3方法中分离方法和类

plot是一个通用的S3方法的一个例子。 因此, plot.lmplot.glm是调用plot(lm(...))plot(glm(...))时使用的基础函数定义

3.隐藏内部function

编写软件包时,在函数名称中使用前导点有时很有用,因为这些函数在一般视图中是有些隐藏的。 function,纯粹是一个包内部有时使用这个。

在这种情况下,“有点隐藏”仅仅意味着当用ls()列出对象时,variables(或函数)通常不会显示出来。 要强制ls显示这些variables,请使用ls(all.names=TRUE) 。 通过使用点作为variables的第一个字母,可以更改variables的范围。 例如:

 x <- 3 .x <- 4 ls() [1] "x" ls(all.names=TRUE) [1] ".x" "x" x [1] 3 .x [1] 4 

4.其他可能的原因

在Hadley的plyr软件包中,他使用惯例在函数名称中使用前导点。 这是一种机制,可以确保在parsingvariables名称时,将值parsing为用户variables而不是内部函数variables。


并发症

这种不同用途的混杂可能导致非常混乱的情况,因为这些不同的用途都可能混淆在相同的函数名称中。

例如,要将data.frame转换为您使用as.list(..)的列表

 as.list(iris) 

在这种情况下, as.list是一个S3generics方法,并且您正在data.frame传递一个data.frame 。 因此S3函数被称为as.list.data.frame

 > as.list.data.frame function (x, ...) { x <- unclass(x) attr(x, "row.names") <- NULL x } <environment: namespace:base> 

而对于一些非常壮观的东西,加载data.table包并查看函数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> 

在一个名字的开始,它像Unix文件名约定一样工作,以保持对象默认隐藏。

 ls() character(0) .a <- 1 ls() character(0) ls(all.names = TRUE) [1] ".a" 

它可以只是一个没有特殊含义的标记,它不会做任何其他允许的标记。

 my.var <- 1 my_var <- 1 myVar <- 1 

它用于S3方法调度。 所以,如果我定义简单的类“myClass”并创build具有该类属性的对象,那么通用函数(如print()将自动派发到我的特定打印方法。

 myvar <- 1 print(myvar) class(myvar) <- c("myClass", class(myvar)) print.myClass <- function(x, ...) { print(paste("a special message for myClass objects, this one has length", length(x))) return(invisible(NULL)) } print(myvar) 

S3的语法有一个不明确的地方,因为你不能从一个函数的名字来判断它是一个S3方法还是只是一个点名。 但是,这是一个非常简单的机制,非常强大。

这三个方面还有很多,你不应该把我的例子当做好的做法,但它们是基本的区别。