簡體   English   中英

如何使函數跳過向量中的參數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM