if语句中的"参数长度为零"

it_*_*ure 0 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 }
      })
Run Code Online (Sandbox Code Playgroud)

但我得到了输出:

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

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

Sim*_*lon 7

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

grep(pattern="W","huh")
# integer(0)
Run Code Online (Sandbox Code Playgroud)

没有匹配导致长度为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
Run Code Online (Sandbox Code Playgroud)