You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么R会对被取子集的NULL进行求值?

R中NULL取子集的隐藏细节:索引表达式仍会被求值

嘿,我发现了R里一个容易被忽略的细节:虽然对NULL执行任何取子集操作(比如NULL[1])最终都会返回NULL,但用于取子集的索引部分会被完整求值,不会因为目标是NULL就跳过这一步。

我们可以用system.time()来验证这个现象:

首先,直接对NULL取子集,耗时几乎为0:

system.time(NULL[1]) 

输出:

user  system elapsed 
      0       0       0 

然后单独运行一个比较耗时的计算,比如生成1e7个随机数:

system.time(sample(1e7)) 

输出:

user  system elapsed 
 0.582   0.010   0.598 

现在把这个耗时的计算作为NULL取子集的索引,你会发现耗时和单独运行这个计算几乎一样:

system.time(NULL[sample(1e7)]) 

输出:

user  system elapsed 
 0.575   0.011   0.594 

这个细节在实际写代码的时候很容易踩坑,比如我在函数里创建列表的场景:

l <- list(
  var1 = arg1[复杂计算1的求值结果],
  var2 = arg2[复杂计算2的求值结果]
  # ... 更多类似项
)

如果arg1碰巧是NULL,那后面的“复杂计算1”还是会被执行,平白消耗计算资源——这时候就得提前判断目标是否为NULL,避免不必要的求值。

内容的提问来源于stack exchange,提问作者MartijnVanAttekum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:30:16