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
분리되지 않습니다 .data
frame
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의 plyr 패키지에서 그는 함수 이름에 선행 점을 사용하는 규칙을 사용합니다. 이것은 변수 이름을 확인할 때 값이 내부 함수 변수가 아닌 사용자 변수로 확인되도록하는 메커니즘입니다.
합병증
서로 다른 용도의 이러한 혼란은 매우 혼란스러운 상황을 초래할 수 있습니다. 이러한 서로 다른 용도는 모두 동일한 함수 이름에서 혼합 될 수 있기 때문입니다.
예를 들어 a data.frame
를 사용하는 목록 으로 변환 하려면as.list(..)
as.list(iris)
이 경우 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>
정말 멋진 것을 원한다면 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.
'developer tip' 카테고리의 다른 글
Android에서 ListView 항목의 배경색 변경 (0) | 2020.11.01 |
---|---|
JAXB를 사용하는 속성 및 컨텐츠가있는 XML 요소 (0) | 2020.11.01 |
타임 스탬프 날짜를 MySQL의 날짜 전용 매개 변수와 비교하는 방법은 무엇입니까? (0) | 2020.11.01 |
IEx-여러 줄 명령을 취소하는 방법은 무엇입니까? (0) | 2020.11.01 |
ASPNETCORE_ENVIRONMENT를 asp.net 핵심 응용 프로그램 게시에 고려하도록 설정하는 방법은 무엇입니까? (0) | 2020.11.01 |