gpt4 book ai didi

r - 为什么使用assign不好?

转载 作者:行者123 更新时间:2023-12-03 08:26:07 27 4
gpt4 key购买 nike

这篇文章 ( Lazy evaluation in R – is assign affected? ) 涵盖了一些共同点,但我不确定它是否能回答我的问题。

我停止使用 assign当我发现 apply family 很久以前,虽然,纯粹是出于优雅的原因,例如这样的情况:

names.foo <- letters
values.foo <- LETTERS
for (i in 1:length(names.foo))
assign(names.foo[i], paste("This is: ", values.foo[i]))

可以替换为:
foo <- lapply(X=values.foo, FUN=function (k) paste("This is :", k))
names(foo) <- names.foo

这也是这个 ( http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f ) R-faq 说应该避免这种情况的原因。

现在,我知道 assign一般不赞成。但还有其他我不知道的原因吗?我怀疑它可能会干扰范围界定或懒惰的评估,但我不确定?演示此类问题的示例代码会很棒。

最佳答案

其实这两种操作是完全不同的。第一个给你 26 个不同的对象,而第二个给你一个。第二个对象将更容易在分析中使用。所以我想我会说你已经证明了 assign 的主要缺点。 ,即必须始终使用 get用于收集或收集现在在全局环境中“松散”的所有类似命名的单个对象。试着想象你将如何用这 26 个单独的对象连续地做任何事情。一个简单的lapply(foo, func)对于第二种策略就足够了。

那个 FAQ 引用实际上只是说使用赋值然后指定名称更容易,但并不意味着它是“坏的”。我碰巧将它读为“功能较少”,因为您实际上并没有返回分配的值。该效果看起来是副作用(在这种情况下,assign 策略导致 26 个单独的副作用)。 assign的使用似乎被来自具有全局变量的语言的人们所采用,作为避免采用“真正的 R 方式”的一种方式,即使用数据对象进行函数式编程。他们真的应该学习使用列表,而不是用单独命名的项目乱丢他们的工作区。

还有另一种赋值范式可以使用:

 foo <- setNames(  paste0(letters,1:26),  LETTERS)

这将创建一个命名的原子向量而不是一个命名的列表,但对向量中值的访问仍然使用赋予 [ 的名称来完成。 .

关于r - 为什么使用assign不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559390/

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