【问题标题】:Error in an if statement not reponding to clausesif 语句中的错误不响应子句
【发布时间】:2017-02-04 03:32:36
【问题描述】:

我需要创建一个文件来为题库编写基本统计问题。

我在 r 中编写了一个脚本,其中在 for 语句的每个循环中创建一个数据集,然后将其转换为单个频率向量。然后使用以下模式选择问题:第 1 周期中的“q1”、第 2 周期中的“q2”、第 3 周期中的“q3”、第 4 周期中的“q1”、第 5 周期中的“q2”等。执行此操作通过 if 语句。

问题和答案被写入以日期命名的文件中。

问题是答案是错误的,程序有时会保留最后一个值,我不知道为什么。这是一个示例输出:

我使用的代码如下:

Aaa <- function() 
{ 
  Qt  <<- readline(prompt="Iterations:")  
  } 

Aaa() 

##### Create file to sink to:#################
Date.<-Sys.Date()
Date.<-format(Date., format="%Y%m%d")
Archivo<- paste(Date.,".txt",sep="")

##### Create iterations ######################

sink(Archivo, append=FALSE)
cat("PRUEBA")
cat("\n")
sink(NULL)

for (i in 1:Qt){
  j<-(i/3-trunc(i/3))*3  

sink(Archivo, append=TRUE)

##### Generación de variables y cálculos #####  

  x<-round(rnorm(400,55,12),0)

  cuts<-seq(10.5,100.5,9)
  x<-x[x>10]
  x<-x[x<101]
  Table.<-hist(x,breaks = cuts,plot = FALSE)$counts
  Class. <- sample(3:9,1)

if (j==0) {
  Qstn <- paste("What is cum sum for class ",Class.,"?",sep="")
  Answ<-cumsum(Table.)[Class.]
} else if (j==1) {
  Qstn <- paste("What % of data corresponds to class ",Class.,"?",sep="")
  Answ<-Table.[Class.]/sum(Table.)*100 
} else if (j==2) {
  Qstn <- paste("Cummulative percent for class ",Class.,"?",sep="")
  Answ<-cumsum(Table.)[Class.]/length(x)*100 
}

##### List of questions #####
  cat(Table.,sep=", ")
    cat("\nQuestion ",i,":\n", 
      Qstn,"?\n",
    "=",Answ,"\n",
    "\n\n\n",
    sep="")

sink(NULL)
}

【问题讨论】:

    标签: r if-statement for-loop


    【解决方案1】:

    如果您创建一个名为 Qt 的数据对象并使用字符向量填充它,那么您可能会感到惊讶:

    Error in 1:Qt : NA/NaN argument
    

    先运行这样的东西:

    Aaa <- function() {
      repeat( { ANSWER <- readline("Iterations:")
      if ( as.numeric(ANSWER)  >= 1){Qt <<- as.numeric(ANSWER)
            break} })}
    

    然后运行这个:

    Aaa()
    

    然后运行其余代码。

    【讨论】:

    • 谢谢 Jan。它不起作用,原因是问题不在于 ANSWER 变量,而在于 if 语句。由于某种原因,在第五次迭代中停止正常工作...
    • 您需要更详细地描述“它不起作用”的意思。我还要注意,创建“j”变量的代码给出的结果可能与您的预期不同:(i/3-trunc((1:5)/3))*3 返回[1] 10 10 7 7 7
    • 用“它不起作用”我的意思是当 j 变量应该是 3 时,if 函数“j==3”将它声明为假......但你指出正确的地方:j&lt;-((1:5)/3-trunc((1:5)/3))*3 应该返回 [1] 0 1 2 0 1 但它似乎返回相同但不明显的 UNROUNDED。我把它改成了j&lt;-round((i/3-trunc(i/3))*3,1),它成功了!
    • 代码的哪一部分是“j应该是3”?您有几页代码,您没有描述输入或所需的输出。您也没有对描述目标的请求做出实质性回应,因此我倾向于放弃并将问题标记为结束。
    • Jan:这是我第一次发布问题,希望我不会大惊小怪。我希望 j 在我想要的多次迭代中使用以下值循环:[1] 0 1 2 0 1 2 0。我将cat("Value of j: ",j) 放在唯一的 if 语句之前。当 j=0 时 if 语句将返回 j==0 为真,但当 j=1 时 if 语句将返回 j==1 为假(与 2 相同)。
    【解决方案2】:

    我解决了由 Jan 的 cmets 提出的问题。

    问题:当j变量应该是2时,if函数if (j==2)返回FALSE...

    观察: j&lt;-((1:5)/3-trunc((1:5)/3))*3 应该返回 [1] 0 1 2 0 1 但它似乎返回相同但不明显的 UNROUNDED。

    解决方案: 我把它改成了j&lt;-round((i/3-trunc(i/3))*3,1),它成功了!

    【讨论】:

    • 仍在试图找出 Jan 是谁。
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2011-09-22
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多