【问题标题】:Why don't lambda functions handle replacement functions in their intuitive form?为什么 lambda 函数不以直观的形式处理替换函数?
【发布时间】:2021-11-27 19:37:45
【问题描述】:

为什么 lambda 函数不以自然形式处理 replacement functions?例如,考虑length<- 函数。假设我想标准化对象列表的长度,我可能会这样做:

a <- list(c("20M1", "A1", "ACC1"), c("20M2", "A2", "ACC2"), c("20M3"))

mx <- max(lengths(a))

lapply(a, `length<-`, mx)
#> [[1]]
#> [1] "20M1" "A1"   "ACC1"
#> 
#> [[2]]
#> [1] "20M2" "A2"   "ACC2"
#> 
#> [[3]]
#> [1] "20M3" NA     NA

但是,如果我想使用 lambda 函数显式指定参数输入位置,我需要这样做(这也可以):

lapply(a, function(x) `length<-`(x, mx))

但是为什么替换函数的更直观表示法(见下文)不起作用?

lapply(a, function(x) length(x) <- mx)
#> [[1]]
#> [1] 3
#> 
#> [[2]]
#> [1] 3
#> 
#> [[3]]
#> [1] 3

这会返回一个我没想到的输出。这里发生了什么? Lambda 函数似乎可以处理 infix functions 的直观形式,所以我有点惊讶它们不能使用替换函数的直观形式。为什么这样 / 有没有办法在 lambda 函数中使用直观的形式指定替换函数?

(我想这与特殊运算符 &lt;-... 有关,但会很好奇解决方案或更准确的解释)。

【问题讨论】:

标签: r lapply purrr names


【解决方案1】:

每当您在 R 中进行赋值时,从该表达式返回的值就是右侧的值。即使对于分配函数的“特殊”版本也是如此。例如,如果你这样做

x <- 1:2; y <- (names(x) <- letters[1:2])
> y
[1] "a" "b"

您可以看到y 获取名称的值,而不是x 的更新值。

如果你想返回更新后的值本身,你需要明确地这样做

lapply(a, function(x) {length(x) <- mx; x})

【讨论】:

  • 所以差异是因为 ``length(x, 3) 返回一个值,但 length(x) &lt;- 3 没有?
  • length(x) &lt;- 3 确实返回一个值。它只返回3。它不返回 x 的更新值
  • 很好的答案。我也从未真正想过要做多步/线 lambda 函数!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多