更改文件名的简单循环不起作用

Posted

技术标签:

【中文标题】更改文件名的简单循环不起作用【英文标题】:Simple loop for changing file names doesn't work 【发布时间】:2017-01-03 16:07:21 【问题描述】:

我编写了以下循环来将用户输入(可以是一位、两位或三位数字)转换为所有三位数字;这样输入向量 [7, 8, 9, 10, 11] 将被转换为输出向量 [007, 008, 009, 010, 011]。这是我的代码:

zeroes <- function(id)

    for(i in 1:length(id))
        if(id[i] <= 9)
            id[i] <- paste("00", id[i], sep = "")
        
        else if(id[i] >= 10 && id[i] <= 99)
            id[i] <- paste("0", id[i], sep = "")
        
    
id

对于输入向量

id <- 50:100

我得到以下输出:

 [1] "050"   "0051"  "0052"  "0053"  "0054"  "0055"  "0056"  "0057"  "0058"  "0059" 
[11] "0060"  "0061"  "0062"  "0063"  "0064"  "0065"  "0066"  "0067"  "0068"  "0069" 
[21] "0070"  "0071"  "0072"  "0073"  "0074"  "0075"  "0076"  "0077"  "0078"  "0079" 
[31] "0080"  "0081"  "0082"  "0083"  "0084"  "0085"  "0086"  "0087"  "0088"  "0089" 
[41] "090"   "091"   "092"   "093"   "094"   "095"   "096"   "097"   "098"   "099"  
[51] "00100"

所以,对于 id[1],该函数看起来有效,然后以下数字存在错误,但对于 id[41:50],我再次得到正确的输出。我一直无法弄清楚为什么会这样,以及我做错了什么。任何建议都受到热烈欢迎。

【问题讨论】:

只要使用sprintf("%03i",id) 感谢您的回答,我也这样做了,它有效。我仍然想知道为什么 R 对上面的代码有问题.. 或者如果由于某种原因您不想使用sprintf 并且更喜欢paste 结果一起使用然后paste0(strrep("0", 3-nchar(id)), id) 另请注意,这确实有效:unlist(zeroes(as.list(id))) 因为列表的每个组件都可以有不同的类,因此转换为字符不会影响其他组件。这也可以:sapply(id, zeroes)Vectorize(zeroes)(id) 一样。 【参考方案1】:

这是因为当您在函数中对 id 进行第一次替换时,向量变成了字符(因为向量不能存储数字和字符)。

所以zeroes(51) 工作正常:

> zeroes(51)
[1] "051"

但如果是第二项,则失败:

> zeroes(c(50,51))
[1] "050"  "0051"

因为当您的循环到达 51 时,它实际上是引号中的“51”。这失败了:

> zeroes("51")
[1] "0051"

因为“51”小于9:

> "51"<9
[1] TRUE

因为 R 将 9 转换为“9”然后进行字符比较,所以只有“5”与“9”进行比较,并且“5”在排序序列字母表中位于“9”之前。

其他语言可能会将字符“51”转换为数字,然后与数字 9 进行比较,然后说“51”

教训:不要覆盖您的输入向量! (并使用sprintf)。

【讨论】:

您可以在"51"&lt;9 中将 9 强制转换为字符,并且可能会说因为 charToRaw("5") 确实小于 CharToRaw("9") 它记录在?"&lt;" 中,“(递减)优先顺序是字符、复数、数字、整数、逻辑和原始。” @Spacedman 感谢这个有趣的答案,这完全有道理。在执行循环时,我不知道对字符向量的隐式强制。 javascript 似乎以另一种方式进行转换:“51”true,在 R 中是 FALSE

以上是关于更改文件名的简单循环不起作用的主要内容,如果未能解决你的问题,请参考以下文章

通过更改 SwiftUI 中的 @State 变量来刷新视图不起作用

在子组件的 beforeDestroy/Destroyed 循环中更改道具的值不起作用

结束播放功能上的 HTML5 视频循环 src 更改不起作用

带有 GAE 的 Yaml 寻址和模板不起作用? TemplateDoesNotExist 只需简单地更改 yaml ?

简单的for循环不起作用[关闭]

简单的for循环在python中不起作用