if语句中的“参数长度为零”

时间:2014-01-02 13:10:45

标签: r

我想根据数字+ W是数字* 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,我的代码有什么问题?

3 个答案:

答案 0 :(得分:6)

您的查询可以通过以下示例进行说明:

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

答案 1 :(得分:0)

这是一种相当奇怪的方法,它可以正常工作:

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])

答案 2 :(得分:0)

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 等函数之前,对变量进行更多类型检查。