gpt4 book ai didi

r - 使用 `with` 分配给 data.frame

转载 作者:行者123 更新时间:2023-12-04 10:39:56 25 4
gpt4 key购买 nike

这是一个以两种不同方式分配的示例,一种有效,另一种无效:

library(datasets)
dat <- as.data.frame(ChickWeight)
dat$test1 <- with(dat, Time + weight)
with(dat, test2 <- Time + weight)
> colnames(dat)
[1] "weight" "Time" "Chick" "Diet" "test1"

我已经习惯了这种行为。也许更令人惊讶的是 test2 就这样消失了(而不是像我预期的那样在基础环境中结束):

> ls(pattern="test")
character(0)

注意 with 是一个相当简单的^H^H^H^H^H^H 短函数:

function (data, expr, ...) 
eval(substitute(expr), data, enclos = parent.frame())

首先让我们复制 with 的功能:

eval( substitute(Time+weight), envir=dat, enclos=parent.frame() )

现在使用不同的外壳进行测试:

testEnv <- new.env()
eval( substitute(test3 <- Time+weight), envir=dat, enclos=testEnv )
ls( envir=testEnv )

仍然没有分配任何地方。这反驳了我的直觉,即它与被丢弃的封闭环境有关,而是指向 ,enclos 论点更基本的东西没有按照我的想法去做。

我很好奇为什么会发生这种情况的机制,以及是否有允许分配的替代方案

最佳答案

更改 withwithin . with仅用于使变量可用,而不是更改它们。

编辑:详细来说,我相信两者withwithin创建一个新环境并用给定的类似列表的对象(例如数据框)填充它,然后在该环境中评估给定的表达式。不同之处在于 with返回表达式的结果并丢弃环境,而 within返回环境(转换回原来的类,例如 data.frame)。无论哪种方式,在表达式中进行的任何赋值都可能在创建的环境中执行,该环境被 with 丢弃。 .这解释了为什么 test2在做了with(dat, test2 <- Time + weight)之后无处可寻.

注意自 within返回修改后的环境而不是就地编辑它(即按值调用语义),你需要做 dat <- within(dat, test2 <- Time + weight) .

如果你想让一个函数对当前环境(或任何指定的环境)进行赋值,请查看assign .

编辑 2:现代答案是拥抱 tidyverse 并使用 magrittr 和 dplyr:

library(datasets)
library(dplyr)
library(magrittr)
dat <- as.data.frame(ChickWeight)
dat %<>% mutate(test1 = Time + weight)

最后一行相当于

dat <- dat %>% mutate(test1 = Time + weight)

又等同于

dat <- mutate(dat, test1 = Time + weight)

使用最后 3 行中对您最有意义的任何一行。

关于r - 使用 `with` 分配给 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819135/

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