我正在使用R中的列表,看起来像这样
add:
.page {
min-height: 100vh; /*min-height not height :)*/
}
现在假设我想要生成与此列表对应的数字列表,如此
<?php
if(filter_var($_POST['txtNumero'], FILTER_VALIDATE_INT) AND in_array(substr($_POST['txtNumero'], 0, 1), array(6, 7, 8))) {
echo "Correct";
} else {
echo "Incorrect";
}
?>
换句话说,第一个列表给出了从1到16的数字序列列表的组,第二个列表给出了每个组的开始和结束。
如果你考虑序列
,这可能更容易看到1 2 3-6 7-10 11 12-15 16
有一种简单的方法吗?我想我可以使用某种全局索引和lapply来做它,但我想看看是否有更简单的方法。
答案 0 :(得分:4)
这是一种方式
# alternate input suggested by @MichaelChirico
d = c(0,0,3,3,0,3,0)
# my preferred approach
library(data.table) # version 1.9.5+
Map(c,
seq_along(d)+shift(cumsum(d), type="lag", fill=0),
seq_along(d)+cumsum(d)
)
@akrun的类似变体:
# alternate input, starting from OP's
d2 = c(0, 0, 4, 4, 0, 4, 0)
d2 = replace( d2, !d2, 1)
# @akrun's answer
Map(c, cumsum(d2)-d2+1, cumsum(d2))
还有一些:
# my original answer
start = c(1,head(cumsum(d+1)+1,-1))
Map(c, start, start + d)
# another way
s = sequence(d+1)
Map(c, seq_along(s)[s==1], seq_along(s)[c(diff(s) < 1, TRUE)] )
答案 1 :(得分:3)
这是一种略有不同的方法:
x <- c(0,0,3,3,0,3,0)
f <- function(x) {
ee <- split(seq_len(sum(x+1)), rep.int(seq_along(x), x+1))
lapply(ee, range)
}
f(x)
答案 2 :(得分:1)
这是一个能够做到这一点的功能,不像@ Frank的回答那么优雅:
mygenerator <- function(vec){
counter <- 1
outlist <- list()
for(i in 1:length(vec)){
if(vec[i] == 0){
outlist[[i]] <- c(counter, counter)
counter <- counter + 1
} else {
outlist[[i]] <- c(counter, counter + vec[i] - 1)
counter <- counter + vec[i]
}
}
outlist
}
mygenerator(c(0, 0, 4, 4, 0, 4, 0))
[[1]]
[1] 1 1
[[2]]
[1] 2 2
[[3]]
[1] 3 6
[[4]]
[1] 7 10
[[5]]
[1] 11 11
[[6]]
[1] 12 15
[[7]]
[1] 16 16