为什么 lambda 函数不以其直观形式处理替换函数?
Why don't lambda functions handle replacement functions in their intuitive form?
为什么 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
这个returns出乎我意料的输出。这里发生了什么? Lambda 函数似乎可以处理 infix functions 的直观形式,所以我有点惊讶它们不能处理替换函数的直观形式。为什么这是/有没有一种方法可以使用直观的形式在 lambda 函数中指定替换函数?
(我想这与特殊运算符 <-
有关系...但很想知道解决方案或更准确的解释)。
每当您在 R 中进行赋值时,从该表达式中 return 得到的值就是右侧的值。即使对于“特殊”版本的赋值函数也是如此。例如,如果你这样做
x <- 1:2; y <- (names(x) <- letters[1:2])
> y
[1] "a" "b"
您可以看到 y
获取的是名称的值,而不是 x
的更新值。
在你的情况下,如果你想 return 更新值本身,你需要明确地这样做
lapply(a, function(x) {length(x) <- mx; x})
为什么 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
这个returns出乎我意料的输出。这里发生了什么? Lambda 函数似乎可以处理 infix functions 的直观形式,所以我有点惊讶它们不能处理替换函数的直观形式。为什么这是/有没有一种方法可以使用直观的形式在 lambda 函数中指定替换函数?
(我想这与特殊运算符 <-
有关系...但很想知道解决方案或更准确的解释)。
每当您在 R 中进行赋值时,从该表达式中 return 得到的值就是右侧的值。即使对于“特殊”版本的赋值函数也是如此。例如,如果你这样做
x <- 1:2; y <- (names(x) <- letters[1:2])
> y
[1] "a" "b"
您可以看到 y
获取的是名称的值,而不是 x
的更新值。
在你的情况下,如果你想 return 更新值本身,你需要明确地这样做
lapply(a, function(x) {length(x) <- mx; x})