为什么R中带lambda函数的原生管道操作未返回预期矩阵?
代码运行结果不符合预期的原因
你的代码返回列名字符串向量而非修改后矩阵,由两个R语法特性共同导致:
- R中
colnames(x) <- c("X", "Y", "Z")这类替换函数赋值语句的默认返回值是等号右侧的赋值内容,也就是你定义的列名字符串向量,而非修改后的矩阵对象。 - 你编写的lambda匿名函数没有显式指定返回值,R会默认将函数最后一行代码的运行结果作为返回值,因此原生管道最终传递给
mat1的就是colnames<-语句返回的列名字符串向量。
正确实现方案
方案1:匿名函数内显式返回修改后的矩阵
在赋值语句后追加矩阵变量名,让函数返回修改后的矩阵:
mat1 <- matrix(rnorm(24), ncol = 3) |> (\(x) { colnames(x) <- c("X", "Y", "Z") x })()
方案2:用structure函数直接设置属性,写法更简洁
无需自定义匿名函数,直接通过structure设置矩阵的行名列名属性:
mat1 <- matrix(rnorm(24), ncol = 3) |> structure(dimnames = list(NULL, c("X", "Y", "Z")))
内容的提问来源于stack exchange,提问作者user3359624
相关产品推荐
相关产品推荐

