R语言矩阵操作中出现attempt to apply non-function报错解析
R语言矩阵创建报错排查:
attempt to apply non-function 报错含义
触发报错的完整提示:
Error in matrix((c(2, 3, -1)(0, -2, 4))(0, -4, 3)) : attempt to apply non-function
该报错的核心是R解释器在解析代码时,试图把一个不属于函数类型的对象当做可执行函数去运行,因为类型不匹配直接中断执行。
报错产生原因
先列出用户提交的原始错误代码:
# 原始错误代码 a<-matrix(c(2,3,-1) (0,-2,4) (0,-4,3),nrow = 3)
错误触发的具体逻辑:
- R的语法解析规则默认:两个相邻表达式如果写成「对象 紧跟 带括号的内容」的结构,会被自动判定为函数调用——也就是前面的对象是要执行的函数,后面括号里的内容是传入的函数参数,不管这个对象实际是不是函数。
- 上述代码里,
c(2,3,-1)本质是一个存了3个数值的普通向量对象,不是可调用的函数,它后面紧跟着换行的(0,-2,4)结构,直接被R判定为「拿c(2,3,-1)当函数,把(0,-2,4)当参数调用」。 - 后续的
(0,-2,4)同样会顺着前面的解析逻辑,被当成上一个调用的返回值继续做函数调用,层层传递触发类型不匹配的问题,最终抛出报错。 - 代码里还有个隐含的逻辑问题:从代码结构能看出来用户是想逐行填充3行矩阵,但
matrix()函数默认是按列填充的,就算语法改对了,不指定填充方向的话,最终矩阵的元素顺序也和预期不符。
对应解决方法
调整后的可运行代码要满足两个要求:一是消除语法歧义,二是匹配逐行填充的需求:
- 把所有需要放进矩阵的数值,统一放在同一个
c()拼接函数里,元素、不同行的代码片段之间用逗号分隔,避免被误判成函数调用结构 - 逐行填充矩阵时,在
matrix()函数参数里加上byrow = TRUE,覆盖默认的按列填充逻辑
修正后的代码:
a <- matrix(c(2, 3, -1, 0, -2, 4, 0, -4, 3), nrow = 3, byrow = TRUE)
代码运行后生成的矩阵结果:
[,1] [,2] [,3] [1,] 2 3 -1 [2,] 0 -2 4 [3,] 0 -4 3
内容的提问来源于stack exchange,提问作者Enos jeba
相关产品推荐
相关产品推荐

