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

时间:2017-01-03 16:07:21

标签: r loops vector user-input

我编写了以下循环,将用户输入转换为所有三位数字,可以是单数字,两位或三位数字;这样输入矢量[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]看起来这个函数是有效的,那么下面的数字就有一个bug,但是对于id [41:50],我又得到了正确的输出。我还没有弄清楚为什么会这样,我做错了什么。任何建议都受到热烈欢迎。

1 个答案:

答案 0 :(得分:6)

因为当你在函数中对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”&lt; 9为False,但R会这样做。

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