gpt4 book ai didi

r - 为什么不存在的 data.frame 列中的项目分配有效?

转载 作者:行者123 更新时间:2023-12-04 10:29:46 24 4
gpt4 key购买 nike

灵感来自 Q6437164 :有人可以向我解释为什么以下有效:

iriscopy<-iris #or whatever other data.frame
iriscopy$someNonExistantColumn[1]<-15

对我来说,R 如何解释这个语句似乎并不明显:创建一个名为 someNonExistantColumn 的新列。在 data.frame 中,并将第一个值(实际上,所有值,看起来)设置为值 15。

最佳答案

R 语言定义手册为我们提供了 R 如何评估以下形式的表达式的指针:

x$foo[1] <- 15

也就是说,就好像我们已经打电话
`*tmp*` <- x
x <- "$<-.data.frame"(`*tmp*`, name = "foo",
value = "[<-.data.frame"("$.data.frame"(`*tmp*`, "foo"),
1, value = 15))
rm(`*tmp*`)

如果为了说明的目的,我们放弃使用的实际方法,中间部分可能更容易解决:
x <- "$<-"(`*tmp*`, name = "foo", 
value = "[<-"("$"(`*tmp*`, "foo"), 1, value = 15))

使用 iris 回到你的例子,我们有类似的东西
iris$foo[1] <- 15

在这里,函数被递归评估。首先提取函数 "$"用于访问组件 "foo"来自 iris , 即 NULL :
> "$"(iris, "foo")
NULL

然后, "[<-"用于将上面返回的对象的第一个元素( NULL )替换为值 15 ,即调用:
> "[<-"(NULL, 1, value = 15)
[1] 15

现在,这是用作参数的对象 value在我们调用的最外层,即使用 "$<-" 的赋值:
> head("$<-"(iris, "foo", value = 15))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species foo
1 5.1 3.5 1.4 0.2 setosa 15
2 4.9 3.0 1.4 0.2 setosa 15
3 4.7 3.2 1.3 0.2 setosa 15
4 4.6 3.1 1.5 0.2 setosa 15
5 5.0 3.6 1.4 0.2 setosa 15
6 5.4 3.9 1.7 0.4 setosa 15

(此处包含在 head() 中以限制显示的行数。)

这有望解释该函数如何调用进度。最后要处理的问题是为什么整个向量 foo设置为15? ?"$<-.data.frame" 的详细信息部分给出了答案。 :
Details:

....

Note that there is no ‘data.frame’ method for ‘$’, so ‘x$name’
uses the default method which treats ‘x’ as a list. There is a
replacement method which checks ‘value’ for the correct number of
rows, and replicates it if necessary.

关键是最后一句话。在上面的例子中,最外层的赋值使用了 value = 15 .但此时,我们想要替换整个组件 "foo" ,其长度为 nrow(iris) .因此,实际使用的是 value = rep(15, nrow(iris)) , 在最外层的赋值/函数调用中。

这个例子更加复杂,因为你必须从方便的符号转换
x$foo[1] <- 15

使用 "$<-"() 进入正确的函数调用, "[<-"() , 和 "$"() . Section 3.4.4中的例子R语言定义的使用这个更简单的例子:
names(x)[3] <- "Three"

其评估为
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value="[<-"(names(`*tmp*`), 3, value="Three"))
rm(`*tmp*`)

这稍微容易一些,因为 names()看起来像一个普通的函数调用。

关于r - 为什么不存在的 data.frame 列中的项目分配有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437769/

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