R中的点是什么意思 - 个人偏好,命名约定或更多?

Mat*_*ert 71 coding-style r naming-conventions plyr

我(可能)不是指"所有其他变量",意思就像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>
Run Code Online (Sandbox Code Playgroud)

有什么用?这只是个人偏好,命名惯例还是更多?通常R是如此功能,以至于我错过了以前很久以前完成的技巧.

And*_*rie 109

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

  • 什么都没有
  • S3方法中方法和类之间的分隔符
  • 隐藏功能名称

可能的含义

1.什么都没有

在该点data.frame不开data距离frame,除了在视觉上.

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

plot是通用S3方法的一个示例.因此plot.lmplot.glm是被调用时使用的底层函数定义plot(lm(...))plot(glm(...))

3.隐藏内部功能

在编写包时,在函数名中使用前导点有时很有用,因为这些函数在一般视图中有些隐藏.纯粹是包内部的函数有时会使用它.

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

x <- 3
.x <- 4

ls()
[1] "x"

ls(all.names=TRUE)
[1] ".x" "x" 

x
[1] 3
.x
[1] 4
Run Code Online (Sandbox Code Playgroud)

4.其他可能的原因

在Hadley的包中,他使用约定在函数名中使用前导点.这是一种尝试并确保在解析变量名时,值解析为用户变量而不是内部函数变量的机制.


并发症

这种不同用途的混搭会导致非常混乱的情况,因为这些不同的用途都可以在同一个函数名中混淆.

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

as.list(iris)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,as.list是一个S3泛型方法,您将传递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>
Run Code Online (Sandbox Code Playgroud)

对于真正壮观的东西,加载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>
Run Code Online (Sandbox Code Playgroud)

  • 我只在plyr中这样做,因为你想要区分plyr函数的参数和plyr调用的函数的参数. (3认同)
  • plyr也有一个`.`函数.`get("."); function(...,.env = parent.frame()){structure(as.list(match.call()[ - 1]),env = .env,class ="quoted")}` (3认同)
  • 哦,我明白你的意思了。不,“x”和“.x”的作用域行为是相同的。它们只是碰巧是不同的变量。 (2认同)

mds*_*ner 28

在名称的开头,它的工作方式类似于UNIX文件名约定,以保持对象隐藏.

ls()
character(0)

.a <- 1

ls()
character(0)

ls(all.names = TRUE)
[1] ".a"
Run Code Online (Sandbox Code Playgroud)

它可以只是一个没有特殊含义的标记,它不会做任何比任何其他允许标记更多的事情.

my.var <- 1
my_var <- 1
myVar <- 1
Run Code Online (Sandbox Code Playgroud)

它用于S3方法调度.因此,如果我定义简单类"myClass"并使用该类属性创建对象,那么诸如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)
Run Code Online (Sandbox Code Playgroud)

S3的语法存在歧义,因为无法从函数名称判断它是S3方法还是名称中的点.但是,这是一个非常简单的非常强大的机制.

这三个方面的每个方面都有很多,你不应该把我的例子作为好的做法,但它们是基本的差异.

  • 你为什么要隐藏一些非全球性的物体? (3认同)
  • 您还可以将变量或函数定义为单个点!比如`.= 1`或`.(1)`.这真的很奇怪,尤其是表达式`.*.+.`:-) (3认同)