关于r:更改文件名的简单循环不起作用

 2021-04-26 

Simple loop for changing file names doesn't work

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

1
2
3
4
5
6
7
8
9
10
11
12
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
}

对于输入向量

1
id <- 50:100

我得到以下输出:

1
2
3
4
5
6
 [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],我又得到了正确的输出。我无法弄清楚为什么会这样,以及我做错了什么。任何建议都受到热烈欢迎。


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

所以zeroes(51)可以正常工作:

1
2
> zeroes(51)
[1]"051"

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

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

因为当您的循环进入51时,它实际上是用引号引起来的" 51"。失败了:

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

因为" 51"小于9:

1
2
>"51"<9
[1] TRUE

因为R将9转换为" 9",然后进行字符比较,所以在整理序列字母表中只有" 5"与" 9"进行比较,而" 5"在" 9"之前。 >

其他语言可能会将字符" 51"转换为数字,然后与数字9进行比较,然后说" 51"。<9是False,但是R这样做。

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