对于检查空范围的循环

时间:2018-12-17 14:52:50

标签: r loops

在数学中处理递归方程时,通常使用隐式约定写一个在k = 1,...,d范围内的方程,如果d < 1则认为方程组为空。在R中进行编程时,我希望能够以与数学语句(例如,递归方程式)相同的方式编写for循环,以便它解释一个上限小于下限的范围绑定为空。这样可以确保算法的语法模仿其所基于的数学语句的语法。

不幸的是,R不会以这种方式解释for循环,因此,当您以模仿基础数学的方式对循环进行编程时,这通常会导致错误。例如,考虑一个简单的函数,我们创建一个长度为n的零向量,然后使用循环d内的元素将前k = 1,...,d个值更改为一个零。如果我们在函数中输入d < 1,我们希望函数识别出循环是空的,这样我们就可以得到一个全零的向量。但是,使用标准的for循环,我们得到以下信息:

#Define a function using a recursive pattern
MY_FUNC <- function(n,d) {
  OBJECT <- rep(0, n);
  for (k in 1:d) { OBJECT[k] <- 1 }
  OBJECT }

#Generate some values of the function
MY_FUNC(10,4);
[1] 1 1 1 1 0 0 0 0 0 0

MY_FUNC(10,1);
[1] 1 0 0 0 0 0 0 0 0 0

MY_FUNC(10,0);
[1] 1 0 0 0 0 0 0 0 0 0
#Not what we wanted

MY_FUNC(10,-2);
[1] 1 1 1 1 1 1 1 1 1 1
#Not what we wanted

我的问题R中是否有任何函数执行像for循环这样的循环,但是如果上限小于下限,则将该循环解释为空界?如果没有现有功能,是否可以对R进行编程以这种方式读取循环?

请注意:我不是在寻找简单地以消除循环的方式重新编写此示例函数的答案。我知道可以在这种特定情况下完成此操作,但是我的目标是使循环更正常地工作。显示此示例只是为了清楚地了解我正在处理的现象。

3 个答案:

答案 0 :(得分:2)

编辑

如果您不想在给出负输入时返回错误,则可以将pmaxseq_len一起使用

MY_FUNC <- function(n,d) {
  OBJECT <- rep(0, n);
  for (k in seq_len(pmax(0, d))) { OBJECT[k] <- 1 }
  OBJECT
}

MY_FUNC(10, 4)
#[1] 1 1 1 1 0 0 0 0 0 0
MY_FUNC(10, 1)
#[1] 1 0 0 0 0 0 0 0 0 0
MY_FUNC(10, 0)
#[1] 0 0 0 0 0 0 0 0 0 0
MY_FUNC(10, -2)
#[1] 0 0 0 0 0 0 0 0 0 0

上一个答案

seq_len优先于1:d,这样可以解决这种情况

MY_FUNC <- function(n,d) {
  OBJECT <- rep(0, n);
  for (k in seq_len(d)) { OBJECT[k] <- 1 }
  OBJECT 
}

MY_FUNC(10, 4)
#[1] 1 1 1 1 0 0 0 0 0 0
MY_FUNC(10, 1)
#[1] 1 0 0 0 0 0 0 0 0 0
MY_FUNC(10, 0)
#[1] 0 0 0 0 0 0 0 0 0 0

MY_FUNC(10, -2)
  

seq_len(d)中的错误:参数必须强制为非负整数

答案 1 :(得分:2)

恕我直言,没有通用的for循环可以执行您喜欢的操作,但是您可以通过添加来轻松实现

if(d > 0) break

作为循环开始处的第一条语句。

答案 2 :(得分:0)

该功能可以矢量化

MY_FUNC <- function(n,d) {
 rep(c(1, 0), c(d, n -d))
  }

MY_FUNC(10, 4)
#[1] 1 1 1 1 0 0 0 0 0 0
MY_FUNC(10, 1)
#[1] 1 0 0 0 0 0 0 0 0 0
MY_FUNC(10, 0)
#[1] 0 0 0 0 0 0 0 0 0 0
MY_FUNC(10, -2)
  

rep(c(1,0),c(d,n-d))中的错误:无效的'times'参数