赋值给函数的结果改变变量

nog*_*pes 6 r

通过这个ave功能,我找到了一条非凡的路线:

split(x, g) <- lapply(split(x, g), FUN) # From ave
Run Code Online (Sandbox Code Playgroud)

有趣的是,这条线改变了x我发现意外的价值.我希望这split(x,g)会产生一个列表,可以分配给,但之后丢弃.我的问题是,为什么x变化的价值?

另一个例子可能更好解释:

a <- data.frame(id=c(1,1,2,2), value=c(4,5,7,6))
#   id value
# 1  1     4
# 2  1     5
# 3  2     7
# 4  2     6

split(a,a$id) # Split a row-wise by id into a list of size 2
# $`1`
#   id value
# 1  1     4
# 2  1     5
# $`2`
#   id value
# 3  2     7
# 4  2     6

# Find the row with highest value for each id
lapply(split(a,a$id),function(x) x[which.max(x$value),])
# $`1`
#   id value
# 2  1     5
# $`2`
#   id value
# 3  2     7

# Assigning to the split changes the data.frame a!
split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])
a
#   id value
# 1  1     5
# 2  1     5
# 3  2     7
# 4  2     7
Run Code Online (Sandbox Code Playgroud)

不仅已经a改变了,而且它变成了一个看起来不像作业右手边的价值!即使分配给split(a,a$id)某些变化a(我不明白),为什么它会导致data.frame而不是list

请注意,我了解有更好的方法来完成此任务.我的问题是为什么要split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])改变a

42-*_*42- 2

split 的帮助页面在其标题中写道:“替换形式替换与此类划分相对应的值。” 所以它确实不应该令人意外,尽管我承认它没有被广泛使用。我不明白你的例子如何说明分配的值“看起来不像分配的 RHS!”。最大值被分配给第二个参数因子定义的类别内的“值”列表。

(我确实感谢您提出的问题。我没有意识到这split<-是 的核心ave。我想它的使用比我意识到的更广泛,因为我认为ave这是一个非常有用的功能。)