Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
for循环中的If语句不限定R中的向量_R_Loops_For Loop - Fatal编程技术网

for循环中的If语句不限定R中的向量

for循环中的If语句不限定R中的向量,r,loops,for-loop,R,Loops,For Loop,我在R中编写了一个函数来附加零,这样1到100之间的任何数字都会显示为001(1)、010(10)和100(100),但我无法理解为什么if语句不能像我希望的那样进行限定 id <- 1:11 Attach_zero <- function(id){ i<-1 for(i in id){ if(id[i] < 10){ id[i] <- paste("00",id[i], sep = "")

我在R中编写了一个函数来附加零,这样1到100之间的任何数字都会显示为001(1)、010(10)和100(100),但我无法理解为什么if语句不能像我希望的那样进行限定

id <- 1:11
Attach_zero <- function(id){

    i<-1
    for(i in id){
        if(id[i] < 10){
            id[i] <- paste("00",id[i], sep = "")
        }

        if((id[i] < 100)&&(id[i]>=10)){
            id[i] <- paste("0",id[i], sep = "")
        } 
        print(id[i])
    }
}

id这里的问题是您将字符串(例如“001”)分配给数字向量。执行此操作时,整个
id
向量将转换为
字符
(向量的元素必须为一种类型)

因此,在将
1
10
进行比较并将
“001”
分配给
id[1]
之后,
id
的下一个元素是
“2”
(即字符2)。当不等式包含字符元素(例如
“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着
“100”
“10”
都位于
“2”
之前,因此如果
条件满足,则您的
。除
10
以外的所有数字都是这种情况,根据字母排序,该数字小于
100
,因此,如果满足
条件,则第二个
。当您到达
11
时,两个条件都不会再次满足,因为“word”
“11”
位于单词
“100”
之后

虽然有两种方法可以修复您的函数,但R中存在此功能(如注释中所述),这两种方法都使用
sprintf
formatC

sprintf('%03d', 1:11)
formatC(1:11, flag=0, width=3)
# [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011"
对于另一种矢量化方法,可以使用嵌套的
ifelse
语句:

ifelse(id < 10, paste0('00', id), ifelse(id < 100, paste0('0', id), id))
ifelse(id<10,粘贴0('00',id),ifelse(id<100,粘贴0('0',id),id))

这里的问题是,您正在将字符串(例如“001”)分配给数字向量。执行此操作时,整个
id
向量将转换为
字符
(向量的元素必须为一种类型)

因此,在将
1
10
进行比较并将
“001”
分配给
id[1]
之后,
id
的下一个元素是
“2”
(即字符2)。当不等式包含字符元素(例如
“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着
“100”
“10”
都位于
“2”
之前,因此如果
条件满足,则您的
。除
10
以外的所有数字都是这种情况,根据字母排序,该数字小于
100
,因此,如果满足
条件,则第二个
。当您到达
11
时,两个条件都不会再次满足,因为“word”
“11”
位于单词
“100”
之后

虽然有两种方法可以修复您的函数,但R中存在此功能(如注释中所述),这两种方法都使用
sprintf
formatC

sprintf('%03d', 1:11)
formatC(1:11, flag=0, width=3)
# [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011"
对于另一种矢量化方法,可以使用嵌套的
ifelse
语句:

ifelse(id < 10, paste0('00', id), ifelse(id < 100, paste0('0', id), id))
ifelse(id<10,粘贴0('00',id),ifelse(id<100,粘贴0('0',id),id))

这里的问题是,您正在将字符串(例如“001”)分配给数字向量。执行此操作时,整个
id
向量将转换为
字符
(向量的元素必须为一种类型)

因此,在将
1
10
进行比较并将
“001”
分配给
id[1]
之后,
id
的下一个元素是
“2”
(即字符2)。当不等式包含字符元素(例如
“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着
“100”
“10”
都位于
“2”
之前,因此如果
条件满足,则您的
。除
10
以外的所有数字都是这种情况,根据字母排序,该数字小于
100
,因此,如果满足
条件,则第二个
。当您到达
11
时,两个条件都不会再次满足,因为“word”
“11”
位于单词
“100”
之后

虽然有两种方法可以修复您的函数,但R中存在此功能(如注释中所述),这两种方法都使用
sprintf
formatC

sprintf('%03d', 1:11)
formatC(1:11, flag=0, width=3)
# [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011"
对于另一种矢量化方法,可以使用嵌套的
ifelse
语句:

ifelse(id < 10, paste0('00', id), ifelse(id < 100, paste0('0', id), id))
ifelse(id<10,粘贴0('00',id),ifelse(id<100,粘贴0('0',id),id))

这里的问题是,您正在将字符串(例如“001”)分配给数字向量。执行此操作时,整个
id
向量将转换为
字符
(向量的元素必须为一种类型)

因此,在将
1
10
进行比较并将
“001”
分配给
id[1]
之后,
id
的下一个元素是
“2”
(即字符2)。当不等式包含字符元素(例如
“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着
“100”
“10”
都位于
“2”
之前,因此如果
条件满足,则您的
。除
10
以外的所有数字都是这种情况,根据字母排序,该数字小于
100
,因此,如果满足
条件,则第二个
。当您到达
11
时,两个条件都不会再次满足,因为“word”
“11”
位于单词
“100”
之后

虽然有两种方法可以修复您的函数,但R中存在此功能(如注释中所述),这两种方法都使用
sprintf
formatC

sprintf('%03d', 1:11)
formatC(1:11, flag=0, width=3)
# [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011"
对于另一种矢量化方法,可以使用嵌套的
ifelse
语句:

ifelse(id < 10, paste0('00', id), ifelse(id < 100, paste0('0', id), id))
ifelse(id<10,粘贴0'00',id),ifelse(id<100,粘贴0'0',id),id)