←
PDF 290 / 520 Overwrite the Original
→
English · PDF 290
Original PDF page 290
中文 · PDF 290

(注意,我们这里使用的是 pryr::object_size(),而不是内置的 object.size()。object.size() 只能接受单个对象,因此无法计算数据在多个对象之间的共享情况。)

覆盖原始对象

我们不必在每一步都创建中间对象,而是可以覆盖原始对象:

foo_foo <- hop(foo_foo, through = forest) foo_foo <- scoop(foo_foo, up = field_mice) foo_foo <- bop(foo_foo, on = head)

这样输入更少(思考也更少),因此你更不容易犯错。然而,这存在两个问题:

  • 调试很痛苦。如果你犯了错误,就需要从头开始重新运行整个流程。
  • 被转换对象的重复出现(我们已经写了六次 foo_foo!)掩盖了每一行中实际发生变化的内容。

函数组合

另一种方法是放弃赋值,直接将函数调用串联起来:

bop( scoop( hop(foo_foo, through = forest), up = field_mice ), on = head )

这里的缺点是你必须由内而外、从右到左地阅读,而且参数最终分散在相距很远的地方(形象地称为 达格伍德三明治 问题)。简而言之,这段代码对人类来说很难阅读。

使用管道

最后,我们可以使用管道:

foo_foo %>% hop(through = forest) %>% scoop(up = field_mouse) %>% bop(on = head)