希望我的 for 循环到 return 个字母而不是 R 中的数字

Want my for loop to return letters instead of numbers in R

for(k in seq(0,length(Gs@left)-nl,len=30))
{
fcs <- abs(fft(Gs@left[(k+1):(k+nl)]))
tmp <- lsfit(X,fcs,inter=F)
print(order(-tmp$coef)[1])
}

我有一个 for 循环,它 return 是一个数字列表:

[1] 3
[1] 1
[1] 1
[1] 2

这些数字对应于钢琴上的音符,return G4 代替 1,A4 代替 2 等等...

有没有一种方法可以将我的 for 循环编码为 return 这个(即 1 = "G4" 等...)?

我试过 assign(paste("G4"), 1) 但这行不通。

谢谢

由于缺少相关信息,所以没有确切的答案,但这应该会给你一些提示

df<-data.frame(id=1:10, note=LETTERS[1:10], stringsAsFactors = F)

for (i in 1:5){
  x=sample(1:10,1)
  #print(x)
  print(df[match(x,df$id),2])
}

尝试改用因数:

示例:

data <- c(1,2,3,4,5, 1,3,4)
labeled_data <- factor(data, labels = c("a1", "a2", "a3", "a4", "a5"))
labeled_data

会return

[1] a1 a2 a3 a4 a5 a1 a3 a4
Levels: a1 a2 a3 a4 a5

编写一个函数来进行翻译可能最有意义。

strfnote <- function(notes, base_octave=4) {
  paste0(LETTERS[(notes %% 7) + 1], trunc(notes / 7) + base_octave)
}

这会给我们

> strfnote(0:10)
 [1] "A4" "B4" "C4" "D4" "E4" "F4" "G4" "A5" "B5" "C5" "D5"

您可以使 strfnote 更完整,处理诸如临时记号之类的事情,并准确指定对应于“0”的音符以设置偏移量。但经过一些基本处理后,您的代码可以生成数字,然后为了渲染,您只需将它们传递给此函数即可获得可读形式。

只需设置一个字符串,其中的音符按照您的音乐惯例所隐含的顺序排列(我无法凭直觉认为这完全是音乐性的,并且看到@user295691 可能实际上理解了数学基础)。由于您只给出了两个注释:

# Above the loop
notes=c("G4", "A4", "B4")   # not sure if third one is sensible musically
                            # would have guessed that A5 was next to G4
# in the loop
print( notes[ order(-tmp$coef)[1] ] )

您可以构建一个列表 pianoNotes 并按索引 [[i]] 访问项目。

对于您的示例,这将是:

pianoNotes <- list("1" = "G4") # and more
for(k in seq(0,length(Gs@left)-nl,len=30))
{
  fcs <- abs(fft(Gs@left[(k+1):(k+nl)]))
  tmp <- lsfit(X,fcs,inter=F)
  print(pianoNotes[[order(-tmp$coef)[1]]])
}