楼主: 潇姣彩
2223 8

[问答] 求教:R语言,关于函数调用问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:54份资源

本科生

46%

还不是VIP/贵宾

-

威望
0
论坛币
3441 个
通用积分
0.3570
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
6452 点
帖子
41
精华
0
在线时间
76 小时
注册时间
2015-4-8
最后登录
2022-1-29

楼主
潇姣彩 发表于 2017-5-1 20:11:59 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
R语言,函数两重调用,即  main调用函数F,F函数调用g函数,可以吗?如果main不调用F,可以运行,且结果正确;但是,改成main调用F,F调用g之后,就会报错:Error in B[j]=which.max(C[,j]) : replacement has length zero.
为什么呢?怎么解决?求大神帮忙

代码相关部分:
函数g :
....
return(A) A为矩阵

函数F:
C=g(...)
B=matrix(rep(0, n),nrow=1)
  for(j in 1:n){
    B[j]=which.max(C[,j])
  }



函数main:调用F
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:函数调用 R语言 replacement placement replace 联合

沙发
Eric1028 发表于 2017-5-1 21:42:27
C是函數嗎?

藤椅
cheetahfly 在职认证  发表于 2017-5-1 21:52:42
调用本身没有问题,函数调用自身都没有问题,不要说调用别的了。出错信息说得很清楚:
B[j]=which.max(C[,j])这一句中,which.max(C[,j])的长度为0,说明很可能是空值,你要找这方面的原因。
另外,你既然将B定义为一个矩阵,就要用矩阵的方式来引用,B[1, j]而不是B[j]

板凳
潇姣彩 发表于 2017-5-1 22:16:45
cheetahfly 发表于 2017-5-1 21:52
调用本身没有问题,函数调用自身都没有问题,不要说调用别的了。出错信息说得很清楚:
B[j]=which.max(C[, ...
先谢谢啦~对于你指出的问题,我都检查过:C不存在空值;B[1,j]也不影响

报纸
潇姣彩 发表于 2017-5-1 22:18:15
Eric1028 发表于 2017-5-1 21:42
C是函數嗎?
C是想表示函数g()的返回值A

地板
cheetahfly 在职认证  发表于 2017-5-2 07:44:41
你在for(j in 1:n){这一行之前,插入browser()。进入调试模式后,手动逐行执行B[j]=which.max(C[,j]),看错误是否重复。

7
潇姣彩 发表于 2017-5-2 18:32:56
cheetahfly 发表于 2017-5-2 07:44
你在for(j in 1:n){这一行之前,插入browser()。进入调试模式后,手动逐行执行B[j]=which.max(C[,j]),看错 ...
还是会报错。。。而且矩阵A可以返回,且没有空值。
另外,我的main函数主要是读入数据,然后调用F函数。如果我将main与F改成一个函数,就不会有问题~
实在是不知道该怎么办了

8
cheetahfly 在职认证  发表于 2017-5-2 22:16:50
B[j]=which.max(C[,j])这一句中只涉及两个变量,两个函数,分别是:B[j], C[,j], `=`和which.max(),逐个排除。
矩阵A可以返回说明函数g没有什么问题,但在运算到函数F中时,C=g(...)赋值后,C是否正常?
如果C正常,B正常,看看which.max(C[,j])是什么值?
如果which.max(C[,j])也看似没有问题,就用"<<-"符号将C和B传递到Globalenviroment中再测试语句B[j]=which.max(C[,j]),
如果还是同样的出错信息,请把B和C的具体内容贴上来吧——因为此时已经符合“错误可重复”的条件,可以单独探讨了。

以上是一般的调试逻辑,你这个问题的情况感觉是函数的环境有问题,你在debug状态下,在调用函数F和g之前,分别用pryr::where()去看看这两个函数目前存在于哪个环境中,问题应该出在这方面。

9
潇姣彩 发表于 2017-5-2 23:28:07
cheetahfly 发表于 2017-5-2 22:16
B[j]=which.max(C[,j])这一句中只涉及两个变量,两个函数,分别是:B[j], C[,j], `=`和which.max(),逐个排 ...
解决了,其实都怪自己粗心啦~
谢谢你~让我学到很多东西呢~

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 13:52