You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 18:54:10