[英]How to make a function skip an argument from a vector
说我有以下功能
power<-function (number){
number^2
}
我也有一个向量 -z
z<- c(1:3, "a", 7:9)
我想对向量变量应用幂函数。 如果一切都是数字,则这些函数使用此代码运行良好,该代码可根据需要创建一个列表:
q<-lapply(z, FUN=power)
如果找不到有效的参数,如何使函数跳过? 在这种情况下跳过“a”。 假设删除奇怪的参数不是我的任务的选项。 我也可能遇到函数根本找不到参数的情况(例如空白区域、网页上缺少标签)。 如果该解决方案也适用于这些实例,那就太好了。 谢谢。
考虑创建一个list
而不是一个vector
因为list
可以有多种类型,而vector
只能有一个类,如果有一个character
元素,它将整个对象作为character
返回
z <- list(1:3, "a", 7:9)
lapply(Filter(is.numeric, z), FUN = power)
或者用map_if
library(purrr)
map_if(z, .p = is.numeric, .f = power)
-输出
[[1]]
[1] 1 4 9
[[2]]
[1] "a"
[[3]]
[1] 49 64 81
这将尝试将提供的向量的元素强制转换为数字。 不可强制的值将返回 NA。 请注意,您的输入向量 z 可能不是您想要的,即它解析为字符向量 c("1", "2", "3", "a", ...) 而不是c(1, 2, 3, "a", 7, 8, 9)。
power<-function (number){
result<- as.numeric(number)^2
}
z <- c(1:3, "a", 7:9)
lapply(z, power)
[[1]]
[1] 1
[[2]]
[1] 4
[[3]]
[1] 9
[[4]]
[1] NA
[[5]]
[1] 49
[[6]]
[1] 64
[[7]]
[1] 81
我们还可以编写一个自定义函数,将power
封装在lapply
。 基本上相当于map_if
:
z <- list(1:3, "a", 7:9)
lapply(z, function(x) {
if(all(is.numeric(x))) {
power(x)
} else {
x
}
})
[[1]]
[1] 1 4 9
[[2]]
[1] "a"
[[3]]
[1] 49 64 81
试试下面的代码
power <- Vectorize(function(number) {
ifelse(is.numeric(number), number^2, number)
})
z <- list(1:3, "a", 7:9)
lapply(z, power)
这使
> lapply(z, power)
[[1]]
[1] 1 4 9
[[2]]
a
"a"
[[3]]
[1] 49 64 81
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.