在数学中处理递归方程时,通常使用隐式约定写一个在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
进行编程以这种方式读取循环?
请注意:我不是在寻找简单地以消除循环的方式重新编写此示例函数的答案。我知道可以在这种特定情况下完成此操作,但是我的目标是使循环更正常地工作。显示此示例只是为了清楚地了解我正在处理的现象。
答案 0 :(得分:2)
编辑
如果您不想在给出负输入时返回错误,则可以将pmax
与seq_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'参数