楼主: yearslake
2279 7

[问答] 请教版主这个程序的问题出在哪里? [推广有奖]

  • 4关注
  • 19粉丝

学科带头人

17%

还不是VIP/贵宾

-

威望
0
论坛币
43976 个
通用积分
3.4377
学术水平
11 点
热心指数
26 点
信用等级
5 点
经验
63947 点
帖子
968
精华
0
在线时间
2867 小时
注册时间
2007-9-8
最后登录
2022-3-20

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
先检查输入矩阵是否为矩阵,再检验是否为对称阵。
iis.sym=function(x){
        if (length(x[,1])!=length(x[1,]))
        stop ("请输入方阵")
        else{

           for  (i  in 1:length(x[1,])){
                for ( j in 1:length(x[,1])){
                        if (x[i,j]!=x[j,i])
                            stop ("x不是对称阵")
                }
           }       
               
        }
"x是对称阵"
}
       
               

谢谢。
               

二维码

扫码加我 拉你入群

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

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

关键词:function length leng Stop else 程序

要识得转膊
沙发
Aharach 发表于 2013-1-19 20:21:52 |只看作者 |坛友微信交流群
  1. iis.sym=function(x){
  2.   if (length(x[,1])!=length(x[1,]))
  3.     stop ("请输入方阵")
  4.   else{
  5.    
  6.     for  (i  in 1:length(x[1,])){
  7.       for ( j in 1:length(x[,1])){
  8.         if (x[i,j]!=x[j,i])
  9.           stop ("x不是对称阵")
  10.       }
  11.     }        
  12.    
  13.   }
  14.   "x是对称阵"
  15. }
复制代码
第二个Stop函数后的括号应该是半角字符,你代码里的是全角字符。在编译的时候会报错。

上面贴的是修改过的代码,我在R 2.13上运行没有问题。

使用道具

藤椅
yearslake 发表于 2013-1-19 20:40:31 |只看作者 |坛友微信交流群
Aharach 发表于 2013-1-19 20:21
第二个Stop函数后的括号应该是半角字符,你代码里的是全角字符。在编译的时候会报错。

上面贴的是修改过 ...
的确是这个问题,看了半天没看出来。。。。谢谢了
要识得转膊

使用道具

板凳
jmpamao 发表于 2013-1-19 23:26:16 |只看作者 |坛友微信交流群
@qoiqpwqr 兄
看此题循环,就情不自禁改了下循环。
iis <- function(x){
  if(nrow(x)!=ncol(x)) print("请输入方阵")
  else{
    if(all(x==t(x))) print("对称方阵")else print("不对称方阵")
  }
}
a<- matrix(c(1,2,3,2,2,3,3,3,4),nc=3,byrow=T)
b <- matrix(c(1,2,3,1,2,1,1,2,3),nc=3,byrow=T)
c <- matrix(c(1,2,1),nc=3,byrow=T)
iis(a)....
都可以很好的运行。

但。。。疑惑的事情是(事实上,先想到这个):
iis2 <- function(x){
  ifelse(nrow(x)!=ncol(x),print("请输入方阵"),
         ifelse(all(x==t(x)),print("为对称方阵"),print("不对称")))
}

> iis2(a)
[1] "为对称方阵"
[1] "为对称方阵"
> iis2(d)
[1] "为对称方阵"
[1] "为对称方阵"
> iis2(c)
[1] "请输 入方阵"
[1] "请输入方阵"
怎么运行了两次?真邪门了!
所以把print 换为cat看看:
iis2 <- function(x){
  ifelse(nrow(x)!=ncol(x),print("请输入方阵"),
         ifelse(all(x==t(x)),cat("为对称方阵"),cat("不对称")))
}


> iis2(a)

为对称方阵
错误于ifelse(all(x == t(x)), cat("为对称方阵"), cat("不对称")) :   更换参数长度为零

OMG!直接错误了!!!! 看来是ifelse的语句的问题了。

xy <- 2
ifelse(xy > 3,cat("1"),cat("0"))


> xy <- 2
> ifelse(xy > 3,cat("1"),cat("0"))
0
错误于ifelse(xy > 3, cat("1"), cat("0")) : 更换参数长度为零

这是为什么呢?
???

使用道具

报纸
qoiqpwqr 发表于 2013-1-20 00:56:26 |只看作者 |坛友微信交流群
可以用isSymmetric来判断是否为对称方阵

使用道具

地板
qoiqpwqr 发表于 2013-1-20 01:01:20 |只看作者 |坛友微信交流群
jmpamao 发表于 2013-1-19 23:26
@qoiqpwqr 兄
看此题循环,就情不自禁改了下循环。
iis  3,cat("1"),cat("0"))[ ...
那个两次输出的问题:一个是print输出的,一个是ifelse输出的。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

7
jmpamao 发表于 2013-1-20 23:02:37 |只看作者 |坛友微信交流群
qoiqpwqr 发表于 2013-1-20 01:01
那个两次输出的问题:一个是print输出的,一个是ifelse输出的。
谢谢 qoiqpwqr兄的提示
借 yearslaked 楼主这个问题,顺便把ifelse的之前有个问题,解决掉了。:D
https://bbs.pinggu.org/thread-2175220-1-1.html

> ifelse
function (test, yes, no)
{
    storage.mode(test) <- "logical"
    ans <- test
    nas <- is.na(test)
    if (any(test[!nas]))
        ans[test & !nas] <- rep(yes, length.out = length(ans))[test &
            !nas]
    if (any(!test[!nas]))
        ans[!test & !nas] <- rep(no, length.out = length(ans))[!test &
            !nas]
    ans[nas] <- NA
    ans
}
<bytecode: 0x0deed130>
<environment: namespace:base>

ifelse 中的核心原来是 由rep语句组成的的向量:ans。  ans的初始值为 test的逻辑值,长度为test的长度。再通过if语句,及向量化[..==..]把 rep的值赋予ans.

rep(print("2"),2)
[1] "2"
[1] "2" "2"
print语句优先, 后rep。说明了为什么两次的原因。

rep(cat("2","\n"),2)
> rep(cat("2","\n"),2)
2
NULL
ps:cat() 属于什么类型的数据结构,还是很疑惑。 mode...等等 都不行 cat值也不能赋予给别的对象。

@kaifengedu
还是借着个贴,一起讨论你那个具体的 ifelse撒。
ifelse(Owls$FoodTreatment == "Satiated", Owls$NestNight <- paste(Owls$Nest, "1",sep = "_"),
       Owls$NestNight <- paste(Owls$Nest, "2",sep = "_"))
中有一个有问题的赋值问题
ifelse的返回值会只认function(test,yes, no)中:yes,no部分, 不干预赋值的表达。而Owls$NestNight 进行了两次赋值,只会认后一次的赋值Owls$NestNight <- paste(Owls$Nest, "2",sep = "_"),为最终赋值。 及,为什么都是"_2" , 但是ifelse返回的值,是正确的,是你想要的。(根据 kaifengedu 一起讨论,赋值得部分,是根据是否运行,no 来决定是否 实现第二次赋值)

简单点:就是为什么会:
> x = c(1,1,2,3)
> ifelse(x==1,y <- 1, y <- 0)
[1] 1 1 0 0
> y
[1] 0

如果 <- 改为=号。
这里边其实还是有个很重要的、需要很小心的地方,万分小心 也不为过!!!
(看来<-  = 区别还是有的, 赋值及  =在函数中 有表示参数的作用)
1、ifelse代码:
>ifelse
function(test,yes,no)...

所以:
x = c(1,1,2,3)
ifelse(x==1,y = 1, 0)  #相当与 ifelse(x==1,yes = 1, no=0)
[1] 1 1 0 0
>y
Error: object 'y' not found  #y根本就没有建立,ifelse()中的y只是参数 yes=的缩写字母。

2、ifelse 中使用=, 代表参数,非赋值

ifelse(x==1, you=1,0)是错误的,没有you这个参数。
其中特别小心的地方是:顺序,默认yes在前, no在后, 但如果指明yes 和no 的话,写前,写后都可以
x = c(1,1,2,3)
ifelse(x==1, n= 1, 0)
[1] 0 0 1 1       #不是 [1] 1 1 0 0  haha,n=  为参数no=

同时:
ifelse(x==1,y=1,y=0),对不起, 参数y(yes)是重复的。


qoiqpwqr兄 如有问题与补充 请提出指正,thx
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
kaifengedu + 1 + 1 + 1 这个太强大了.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

8
吴cc 发表于 2013-1-30 14:48:21 |只看作者 |坛友微信交流群
>  data(quakes)
>  mini<-min(quakes$depth)
>  maxi<-max(quakes$depth)
>  int<-ceiling((maxi-mini)/9)
>  inf<-seq(mini,maxi,int)
>  quakes$depth.cat<-factor(floor((quakes$depth-mini)/int),labels=paste(inf,inf+int,sep="-"))
> > xyplot(lat~long|depth.cat,data=quakes)

请问他是怎么形成九个图的?还有,每句是什么意思啊?  谢谢!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-8 05:42