我不知道为什么以下代码不起作用。目的是输入一个字符串向量,其中一些可以转换为数字,有些则不能。以下'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
等......
我不明白为什么会这样。我想我有两个问题。一:为什么会这样?还有两个:通常我很擅长排除故障,但我不知道在哪里找到它。如果您知道问题,您是如何找到/了解解决方案的?我应该打开内部lapply功能代码吗?
答案 0 :(得分:2)
sapply
返回了一个向量,并且无法混合向量。如果您使用lapply
,那么您会得到一个可以混合的列表结果,但使用lapply
而不是sapply
的相同代码可以按照您的意愿运行。
答案 1 :(得分:2)
sapply
不要简化结果。
如果发生简化,则输出类型由 层次结构中返回值的最高类型NULL<原始< 逻辑<整数<双<复杂<字符<列表<表达, 在将骑士列入名单之后。
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"