我正在创建一个小册子打印工作流程,在打开的跨页上打印 2 页:
我已经编写了一个循环,用于为小册子/骑马订序列重新分页 pdf。对于 8 页的小册子,打印顺序应为“8 1 2 7 6 3 4 5”。我可以在下面的循环中创建序列,但不知道如何将它输出到一行中,每个页码用空格分隔。
p <- 16 # number of pages in a saddle stitch, multiple of 4
p.seq <- c(1:p) # page sequence
p2 <- p/2
for (i in 1:p2) {
ifelse(p.seq[i] %% 2 == 0, # true if even number
print(paste(i, p - i + 1, sep=" ")),
print(paste(p - i + 1, i, sep=" "))
)
}
尝试使用
cat(..., append=TRUE)
而不是 print
,但这会停止循环。
试试这个
p <- 16
for (i in seq_len(p/2)) {
if (i %% 2) cat(c(p - i + 1, i), '')
else cat(c(i, p - i + 1), '')
}
# 16 1 2 15 14 3 4 13 12 5 6 11 10 7 8 9
如果您希望能够保存结果(即不仅仅是
print/cat
ed在控制台上),您可以编写一个函数f
:
f <- \(p) unlist(lapply(seq_len(p/2), \(i) {
if (i %% 2) c(p - i + 1, i)
else c(i, p - i + 1)
}))
或更多故障保护
f <- \(p) {
if (is.na(p) || is.null(p)) NULL
else if (p < 0 || p != round(p)) stop('`p` not a positive round number')
else if (p == 1) 1
else {
unlist(lapply(seq_len(p/2), \(i) {
if (i %% 2) c(p - i + 1, i)
else c(i, p - i + 1)
}))
}
}
f(8)
# [1] 8 1 2 7 6 3 4 5
## `cat`ed
cat(f(8))
# 8 1 2 7 6 3 4 5
f(16)
# [1] 16 1 2 15 14 3 4 13 12 5 6 11 10 7 8 9
f(1)
# [1] 1
f(0); f(NA); f(NULL)
# NULL
f(-3.1); f(-1)
# Error in f(-3.1) : `p` not a positive round number
或者,要存储
for
循环结果,您可以初始化一个列表 res
之后您可以 unlist
p <- 8
res <- vector(mode='list', length=p/2)
for (i in seq_len(p/2)) {
if (i %% 2) res[[i]] <- c(p - i + 1, i)
else res[[i]] <- c(i, p - i + 1)
}
unlist(res)
# [1] 8 1 2 7 6 3 4 5
到
cat
它:
cat(unlist(res))
# 8 1 2 7 6 3 4 5