[英]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.