programing

levels<->(이게 무슨 주술입니까?

skycolor 2023. 6. 6. 08:07
반응형

levels<->(이게 무슨 주술입니까?

@Marek는 다른 질문에 대한 답변으로 다음과 같은 솔루션을 게시했습니다. https://stackoverflow.com/a/10432263/636656

dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L, 
                                  7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA, -20L), class = "data.frame")

`levels<-`(
  factor(dat$product),
  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
  )

다음을 출력으로 생성합니다.

 [1] Generic Generic Bayer   Bayer   Advil   Tylenol Generic Advil   Bayer   Generic Advil   Generic Advil   Tylenol
[15] Generic Bayer   Generic Advil   Bayer   Bayer  

이것은 단지 벡터의 출력물일 뿐입니다. 따라서 벡터를 저장하려면 훨씬 더 혼란스러운 작업을 수행할 수 있습니다.

res <- `levels<-`(
  factor(dat$product),
  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
  )

분명히 이것은 레벨 기능에 대한 일종의 호출이지만, 저는 여기서 무엇이 행해지고 있는지 전혀 모르겠습니다.이런 종류의 주술의 용어는 무엇이며, 어떻게 하면 이 영역에서 나의 주술적 능력을 향상시킬 수 있습니까?

여기서의 답은 좋지만, 중요한 점을 놓치고 있습니다.제가 한번 설명해 보겠습니다.

R은 기능적인 언어이며 개체를 변형하는 것을 좋아하지 않습니다.그러나 대체 함수를 사용하여 할당 문을 허용합니다.

levels(x) <- y

와 동등합니다.

x <- `levels<-`(x, y)

요령은, 이 개작은 다음과 같습니다.<-그것은 에 의해 행해지지 않습니다levels<-.levels<-는 입력을 받아 출력을 제공하는 정규 함수일 뿐이며, 어떤 것도 변형시키지 않습니다.

그 결과 하나는 위의 규칙에 따라<-재귀적이어야 합니다.

levels(factor(x)) <- y

이라

factor(x) <- `levels<-`(factor(x), y)

이라

x <- `factor<-`(x, `levels<-`(factor(x), y))

이 순수한 기능적 변환(과제가 발생하는 맨 끝까지)이 명령어로 과제를 수행하는 것과 동등하다는 것은 일종의 아름다운 일입니다.제 기억이 정확하다면, 기능적인 언어로 된 이 구조는 렌즈라고 불립니다.

그러나 일단 다음과 같은 대체 기능을 정의하면levels<-여러분은 또 다른 예상치 못한 횡재를 얻게 됩니다. 여러분은 단순히 할당을 할 수 있는 능력을 가지고 있는 것이 아니라, 요인을 수용하고 다른 수준의 다른 요인을 제공하는 편리한 기능을 가지고 있습니다.그것은 정말 "과제"가 아닙니다!

그래서, 당신이 설명하는 코드는 단지 이 다른 해석을 사용하는 것입니다.levels<-는 그 을 합니다.levels<-과제를 제안하기 때문에 약간 혼란스럽지만, 이것은 진행되고 있는 것이 아닙니다.코드는 일종의 파이프라인을 설정하는 것입니다.

  • 시작:dat$product

  • 요인으로 변환

  • 레벨 변경

  • 을 그을저장에 하세요.res

개인적으로, 저는 그 코드 라인이 아름답다고 생각합니다 ;)

마법은 없습니다. 이것이 바로 (하위) 할당 기능을 정의하는 방법입니다. levels<-요소 자체가 아니라 요인의 속성을 (하위) 계산하는 것은 원시적이기 때문에 약간 다릅니다.이러한 유형의 기능에는 많은 예가 있습니다.

`<-`              # assignment
`[<-`             # sub-assignment
`[<-.data.frame`  # sub-assignment data.frame method
`dimnames<-`      # change dimname attribute
`attributes<-`    # change any attributes

다른 이진 연산자도 다음과 같이 호출할 수 있습니다.

`+`(1,2)  # 3
`-`(1,2)  # -1
`*`(1,2)  # 2
`/`(1,2)  # 0.5

이제 당신이 그것을 알았으니, 이와 같은 것은 정말로 당신의 마음을 놀라게 할 것입니다.

Data <- data.frame(x=1:10, y=10:1)
names(Data)[1] <- "HI"              # How does that work?!? Magic! ;-)

그 "마법"의 이유는 "할당" 양식에 실제 변수가 있어야만 작업할 수 있기 때문입니다.그리고.factor(dat$product)아무 것도 배정되지 않았습니다.

# This works since its done in several steps
x <- factor(dat$product)
levels(x) <- list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
x

# This doesn't work although it's the "same" thing:
levels(factor(dat$product)) <- list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
# Error: could not find function "factor<-"

# and this is the magic work-around that does work
`levels<-`(
  factor(dat$product),
  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
  )

사용자 코드의 경우 왜 그런 언어 조작이 사용되는지 궁금합니다.당신은 이것이 무슨 마술이냐고 물었고 다른 사람들은 당신이 이름을 가진 대체 기능을 부르고 있다고 지적했습니다.levels<-대부분의 사람들에게 이것은 마술이고 실제로 의도된 사용은levels(foo) <- bar.

표시한 사용 사례는 다음과 같습니다.product글로벌 환경에 존재하지 않기 때문에 로컬 환경에서만 존재합니다.levels<-따라서 변경이 지속되지 않습니다. 재할당이 없습니다.dat.

이런 상황에서within()는 사용하기에 이상적인 기능입니다.당신은 자연스럽게 쓰기를 원할 것입니다.

levels(product) <- bar

물론 R에.product개체로 존재하지 않습니다. within()에서는 R 코드를 실행할 환경을 설정하고 해당 환경 내에서 식을 평가하기 때문에 이 문제를 해결할 수 있습니다.호출에서 반환 개체 할당within()따라서 적절하게 수정된 데이터 프레임에 성공합니다.

(새로 .)datX저는 그냥 그렇게 해서 마지막에 중간 단계가 남습니다.)

## one or t'other
#dat2 <- transform(dat, product = factor(product))
dat2 <- within(dat, product <- factor(product))

## then
dat3 <- within(dat2, 
               levels(product) <- list(Tylenol=1:3, Advil=4:6, 
                                       Bayer=7:9, Generic=10:12))

이는 다음을 제공합니다.

> head(dat3)
  product
1 Generic
2 Generic
3   Bayer
4   Bayer
5   Advil
6 Tylenol
> str(dat3)
'data.frame':   20 obs. of  1 variable:
 $ product: Factor w/ 4 levels "Tylenol","Advil",..: 4 4 3 3 2 1 4 2 3 4 ...

경우에 한지 알기 합니다 - 하고, ( 나당이보여는것주경같과어은우에떻의게유알용지 -위한조기다니해합만고당투그데변복다만싶신변경을본하사데고이하고이경터를른다를면들고터약이는군분)levels<-통화는 결국 하고 있습니다.

언급URL : https://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this

반응형