希望我的 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]]])
}
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]]])
}