为什么lambda函数不以其直观的形式处理替换函数? [英] Why don't lambda functions handle replacement functions in their intuitive form?

查看:10
本文介绍了为什么lambda函数不以其直观的形式处理替换函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么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函数中使用直观的形式指定替换函数?

(我想这与特殊运算符<-有关...但希望得到解决方案或更准确的解释)。

推荐答案

每当您在R中进行赋值时,从该表达式返回的值都是右侧的值。即使对于赋值函数的";特殊&q;版本也是如此。例如,如果您这样做

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

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

在您的情况下,如果要返回更新的值本身,则需要显式返回

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

这篇关于为什么lambda函数不以其直观的形式处理替换函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆