使用向量和定义的标量在R中生成金字塔
假设我们有一个所有字母的向量:使用向量和定义的标量在R中生成金字塔,r,R,假设我们有一个所有字母的向量: #Vector Vec <- LETTERS 如何绘制代码,以便我可以从第一行开始使用一个元素,依此类推,直到最后一行在Vec中包含第一个n元素 在某种程度上,这就像一个金字塔,即使第一行只有一个元素,它也应该有n-1空格来容纳其余的行 预期产出将是: #A #AB #ABC #ABCD #ABCDE #ABCDEF #ABCDEFG #ABCDEFGH #ABCDEFGHI #ABCDEFGHIJ 考虑到n可以更大,如果n大于Vec的大小,那么初始元素
#Vector
Vec <- LETTERS
如何绘制代码,以便我可以从第一行开始使用一个元素,依此类推,直到最后一行在Vec
中包含第一个n
元素
在某种程度上,这就像一个金字塔,即使第一行只有一个元素,它也应该有n-1
空格来容纳其余的行
预期产出将是:
#A
#AB
#ABC
#ABCD
#ABCDE
#ABCDEF
#ABCDEFG
#ABCDEFGH
#ABCDEFGHI
#ABCDEFGHIJ
考虑到
n
可以更大,如果n
大于Vec
的大小,那么初始元素应该像XYZABC那样完成行,我们可以在从“Vec”创建单个字符串后,将子字符串与cat
一起使用
cat(paste(substring(paste(Vec, collapse=""), 1, seq_len(n)), collapse="\n"), "\n")
-输出
#A
#AB
#ABC
#ABCD
#ABCDE
#ABCDEF
#ABCDEFG
#ABCDEFGH
#ABCDEFGHI
#ABCDEFGHIJ
或者像@onyanbu建议的那样,使用一个紧凑的选项
cat(substring(paste(Vec, collapse=""), 1, seq_len(n)),sep= "\n")
您可以编写一个打印预期结果的函数:
M<-function(vec, n){
d <- length(vec)
m <- sapply(seq_len(n) - 1, function(x)
paste(Vec[seq(0, x) %%d + 1], collapse = ""))
cat(m, sep="\n")
}
M(Vec, 10)
A
AB
ABC
ABCD
ABCDE
ABCDEF
ABCDEFG
ABCDEFGH
ABCDEFGHI
ABCDEFGHIJ
M(Vec[1:3], 10)
A
AB
ABC
ABCA
ABCAB
ABCABC
ABCABCA
ABCABCAB
ABCABCABC
ABCABCABCA
M试试下面的代码
cat(paste0(sapply(seq(n), function(k) paste0(Vec[(seq(k) - 1) %% length(Vec) + 1], collapse = "")), collapse = "\n"))
给
A
AB
ABC
ABCD
ABCDE
ABCDEF
ABCDEFG
ABCDEFGH
ABCDEFGHI
ABCDEFGHIJ
ABCDEFGHIJK
ABCDEFGHIJKL
ABCDEFGHIJKLM
ABCDEFGHIJKLMN
ABCDEFGHIJKLMNO
ABCDEFGHIJKLMNOP
ABCDEFGHIJKLMNOPQ
ABCDEFGHIJKLMNOPQR
ABCDEFGHIJKLMNOPQRS
ABCDEFGHIJKLMNOPQRST
ABCDEFGHIJKLMNOPQRSTU
ABCDEFGHIJKLMNOPQRSTUV
ABCDEFGHIJKLMNOPQRSTUVW
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVWXY
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZA
ABCDEFGHIJKLMNOPQRSTUVWXYZAB
ABCDEFGHIJKLMNOPQRSTUVWXYZABC
如果给出n,@akrun的回答和@Onyanbu的建议非常简洁
OP要求它在超过长度时循环回到向量的开头,因此我们确实需要额外的代码位来重复向量
vec = LETTERS
n = 30
# Repeats string as many times as needed
temp_vec <- rep(vec,ceiling(n/length(vec)))
#Creates "pyramid"
cat(substring(paste(temp_vec, collapse=""), 1, seq_len(n)),sep= "\n")
对我来说有点太长了。为什么需要第二个粘贴?您可以直接执行cat(子字符串(粘贴(Vec,collapse=“”),1,seq_len(n)),sep=“\n”)
。伟大的解决方案:
vec = LETTERS
n = 30
# Repeats string as many times as needed
temp_vec <- rep(vec,ceiling(n/length(vec)))
#Creates "pyramid"
cat(substring(paste(temp_vec, collapse=""), 1, seq_len(n)),sep= "\n")
cat(substring(paste(rep(vec,ceiling(n/length(vec))), collapse=""), 1, seq_len(n)),sep= "\n")