gpt4 book ai didi

r - `levels<-`(这是什么魔法?

转载 作者:行者123 更新时间:2023-12-03 04:41:30 26 4
gpt4 key购买 nike

在回答另一个问题时,@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(x)[1] <- "a"

levels(x) <- `[<-`(levels(x), 1, "a")

x <- `levels<-`(x, `[<-`(levels(x), 1, "a"))

这种纯函数转换(直到最后发生赋值)相当于命令式语言中的赋值,这有点美妙。函数式语言中的这种构造称为 lens 。在某些编程语言中,镜头的使用可能会很尴尬,但在 R 中它们却可以正常工作。

但是,一旦您定义了替换函数,如levels<- ,你会得到另一个意想不到的意外之财:你不仅有能力进行作业,你还有一个方便的函数,可以接受一个因子,并给出另一个不同级别的因子。确实没有什么“作业”!

所以,您描述的代码只是利用 levels<- 的另一种解释。我承认这个名字levels<-有点令人困惑,因为它建议进行作业,但事实并非如此。该代码只是设置一种管道:

  • dat$product 开头

  • 将其转换为因子

  • 更改级别

  • 将其存储在 res

就我个人而言,我认为这行代码很漂亮;)

关于r - `levels<-`(这是什么魔法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10449366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com