使用向量和定义的标量在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")