【问题标题】:"argument is of length zero" in if statementif 语句中的“参数长度为零”
【发布时间】:2014-01-02 13:10:44
【问题描述】:

我想根据 number+W 为 number*2 的规则计算我的数据。

dat="1W   16   2W   16
      1   16   2W    0
     1W   16   16    0
      4   64   64    0"     
data=read.table(text=dat,header=F)
apply(data,c(1,2),function(y){
     if(grep(pattern="W",y) ==1 )
     {  gsub("W",paste("*",2,sep=""),y)->s;
         eval(parse(text=s));
      } else 
        {y <- y }
      })

但我得到了输出:

if (grep(pattern = "W", y) == 1) { 中的错误:参数长度为零

为什么?如果 y 匹配 "W" 则值为 1,我的代码有什么问题?

【问题讨论】:

  • 正如 SimonO101 指出的那样,你工作太努力了。首先,y&lt;-y 是浪费时间,所以只需else y 就足够了。接下来,不清楚为什么要以字符串开头。我强烈建议返回并修复创建数字和 "numberW" 混合的任何代码。哎呀,你不妨使用sfsmisc:AsciiToInt(),用50 替换87 的实例,然后转换回来:-)

标签: r


【解决方案1】:

您的查询可以用以下示例来说明:

grep(pattern="W","huh")
# integer(0)

没有匹配会导致长度为 0 的向量,因此会出现错误。而是使用grepl,即if( grepl( "W" , y ) )

grepl 的返回值是 TRUEFALSE

作为旁注,eval( parse( "sometext" ) ) 被认为不是一个好主意。您可以尝试改用以下不整洁的lapply 语句(这将比apply 更好,因为您不必先转换为矩阵):

data.frame( lapply( data , function(x) 
                                ifelse( grepl("W",x) , 
                                        as.integer( gsub("W","",x) ) * 2L , 
                                        x ) ) )
#  V1 V2 V3 V4
#1  2 16  4 16
#2  1 16  4  0
#3  2 16  1  0
#4  3 64  3  0

【讨论】:

  • 整数(0)和逻辑(0)是什么意思?
  • 尝试logical(1) 然后logical(3) 看看会发生什么。它们分别是长度为 1 和 3 的逻辑向量(用默认值 FALSE 填充)。 logical(0) 表示 logical 类型的向量,但其中没有值。 integer(0) 是同样的东西,但对于整数。
【解决方案2】:

这是一个相当奇怪的方法,它确实工作得很好:

library(sfsmisc)

foo<- c('2','23', 'W4','W53','17')
bar<-sapply(foo, function(x)AsciiToInt(x))
barw<-sapply(bar,function(x)x[x!=87])
bard<-logical(length(foo))
for (i in 1:length(foo) ) bard[i]<-length(barw[[i]])== length(bar[[i]])

foow<-vector()
for(i in 1:length(foo)) foow[i]<-as.numeric(paste0(chars8bit(barw[[i]]),collapse='') ) *(1+!bard[i])

【讨论】:

    【解决方案3】:

    R 3.4.1 错误:if 语句中的“参数长度为零”

    如果将空向量传递给 if 语句,例如:

    myvariable = c()
    if (myvariable){ 
        print("hello") 
    } 
    

    你会得到一个错误:

    Error in if (myvariable) { : argument is of length zero
    

    空 R 向量可以通过 grep 等函数冒泡数据类型错误,例如:

    if (grepl("foo", c(), fixed = TRUE)){ 
        print("yes") 
    } 
    

    失败的:

    Error in if (grepl("foo", c(), fixed = TRUE)) { : 
      argument is of length zero
    

    因此,补救措施是在将变量作为参数提供给 if 语句或 grep 等函数之前,对变量进行更多类型检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多