developer tip

R에서 점은 무엇을 의미합니까? 개인 선호도, 명명 규칙 또는 그 이상?

copycodes 2020. 11. 1. 18:16
반응형

R에서 점은 무엇을 의미합니까? 개인 선호도, 명명 규칙 또는 그 이상?


나는 (아마) 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은 너무 기능적이라서 오래전에 해왔 던 트릭을 놓쳤습니다.


함수 이름의 점은 다음 중 하나를 의미 할 수 있습니다.

  • 전혀
  • S3 메서드에서 메서드와 클래스 사이의 구분 기호
  • 함수 이름을 숨기려면

가능한 의미

1. 전혀

의 점은 시각적 인 것 외에 에서 data.frame분리되지 않습니다 .dataframe

2. S3 메서드에서 메서드와 클래스 분리

plot일반적인 S3 방법의 한 예입니다. 따라서 plot.lm하고 plot.glm호출 할 때 사용되는 기본 함수 정의이다 plot(lm(...))또는plot(glm(...))

3. 내부 기능 숨기기

패키지를 작성할 때 함수 이름에 선행 점을 사용하는 것이 유용한 경우가 있습니다. 이러한 함수는 일반보기에서 다소 숨겨지기 때문입니다. 순수하게 패키지 내부에있는 함수는 때때로 이것을 사용합니다.

이 문맥에서 "약간 숨김"은 단순히 .NET으로 객체를 나열 할 때 변수 (또는 함수)가 일반적으로 표시되지 않음을 의미합니다 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

4. 기타 가능한 이유

Hadley의 패키지에서 그는 함수 이름에 선행 점을 사용하는 규칙을 사용합니다. 이것은 변수 이름을 확인할 때 값이 내부 함수 변수가 아닌 사용자 변수로 확인되도록하는 메커니즘입니다.


합병증

서로 다른 용도의 이러한 혼란은 매우 혼란스러운 상황을 초래할 수 있습니다. 이러한 서로 다른 용도는 모두 동일한 함수 이름에서 혼합 될 수 있기 때문입니다.

예를 들어 a data.frame를 사용하는 목록 으로 변환 하려면as.list(..)

as.list(iris)

이 경우 as.listS3 제네릭 메서드이며를 전달 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>

At the start of a name it works like the UNIX filename convention to keep objects hidden by default.

ls()
character(0)

.a <- 1

ls()
character(0)

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

It can be just a token with no special meaning, it's not doing anything more than any other allowed token.

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

It's used for S3 method dispatch. So, if I define simple class "myClass" and create objects with that class attribute, then generic functions such as print() will automatically dispatch to my specific print method.

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)

There is an ambiguity in the syntax for S3, since you cannot tell from a function's name whether it is an S3 method or just a dot in the name. But, it's a very simple mechanism that is very powerful.

There's a lot more to each of these three aspects, and you should not take my examples as good practice, but they are the basic differences.

참고 URL : https://stackoverflow.com/questions/7526467/what-does-the-dot-mean-in-r-personal-preference-naming-convention-or-more

반응형