Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Regex 在向量上应用正则表达式_Regex_R_Vector_Apply - Fatal编程技术网

Regex 在向量上应用正则表达式

Regex 在向量上应用正则表达式,regex,r,vector,apply,Regex,R,Vector,Apply,我不知道为什么下面的代码不起作用。其目的是输入字符串向量,其中一些可以转换为数字,一些不能。以下“sapply”函数应使用正则表达式匹配数字,然后返回数字或(如果不是)返回原始数字 sapply(c("test","6","-99.99","test2"), function(v){ if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$",v)){as.numeric(v)} else {v} }) 返回以下结果: "test" "6

我不知道为什么下面的代码不起作用。其目的是输入字符串向量,其中一些可以转换为数字,一些不能。以下“sapply”函数应使用正则表达式匹配数字,然后返回数字或(如果不是)返回原始数字

sapply(c("test","6","-99.99","test2"), function(v){
  if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$",v)){as.numeric(v)} else {v}
})
返回以下结果:

"test"      "6" "-99.99"  "test2" 
编辑:我希望代码返回的内容:

"test"      6  -99.99    "test2
我可以在每个元素上成功运行if语句

> if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$","test")){as.numeric("test")} else {"test"}
[1] "test"
if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$","6")){as.numeric("6")} else {"6"}
[1] 6
等等


我不明白为什么会这样。我想我有两个问题。第一:为什么会这样?第二:通常我很擅长故障排除,但我甚至不知道在哪里可以找到这个。如果你知道这个问题,你是如何找到/知道解决方法的?我应该打开内部lappy函数代码吗?

这是因为
sapply
返回一个向量,并且向量不能混合。如果使用
lappy
,则会得到一个可以混合的列表结果,使用
lappy
而不是
sapply
的相同代码可以按照您的意愿工作。

这种情况是因为
sapply
返回一个向量,而向量不能混合。如果您使用
lappy
,那么您会得到一个可以混合的列表结果,相同的代码,但使用
lappy
而不是
sapply
可以按照您的意愿工作。

@Jeremy指向正确的方向,您可以使用lappy,它返回一个列表。或者,您可以告诉
sapply
不要简化结果

如果发生简化,则输出类型由 层次结构中返回值的最高类型NULL
out
$test
[1] “测试”
$`6`
[1] 6
$`-99.99`
[1] -99.99
$test2
[1] “测试2”

@Jeremy指向正确的方向,您可以使用Lappy,它返回一个列表。或者,您可以告诉
sapply
不要简化结果

如果发生简化,则输出类型由 层次结构中返回值的最高类型NULL
out
$test
[1] “测试”
$`6`
[1] 6
$`-99.99`
[1] -99.99
$test2
[1] “测试2”

啊!非常感谢。我不知道这个事实是如何从我身边溜走的——直接在帮助中。Lappy将非常有效。
sapply
也会返回一个列表。如果你问它。是的,但你基本上只是要求它是一个圈。聪明的人意味着简化的拉皮。啊!非常感谢。我不知道这个事实是如何从我身边溜走的——直接在帮助中。Lappy将非常有效。
sapply
也会返回一个列表。如果你问它。是的,但你基本上只是要求它是一个圈。我的意思是简单的拉皮。
out <- sapply(c("test","6","-99.99","test2"), function(v){

  if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$",v)){
    as.numeric(v)
  } else {
    v
  }
}, simplify = FALSE)
> out
$test
[1] "test"

$`6`
[1] 6

$`-99.99`
[1] -99.99

$test2
[1] "test2"