簡體   English   中英

使用變量名作為 function 參數

[英]Use a variable name as function argument

我想寫一個獨特的 function 來(除其他外)為不同閾值的不同變量過濾數據庫。 我找到了一種方法來指示我想在 function 本身中過濾的變量,但不確定是最好的方法。

我應該如何 go 關於它?

example_db <- data.frame(name=c("A","B","C"), 
                         value_1=c(1,2,3), 
                         value_2=c(2,3,1))

advanced_filter <- function(data,variable,limit){
  
  require(dplyr)
  data <- data %>% 
    dplyr::filter(variabe>limit) 
  
  return(data)
}

預期結果:

advanced_filter(example_db,value_1,2)

name value_1 value_2
1    C       3       1

我的嘗試:

advance_filter <- function(data,variable,limit){
  require(dplyr)
  f <- paste(variable, ">",  limit)
  data <- data %>% 
    dplyr::filter_(f) 
  
  return(data)
}


advance_filter(example_db,"value_1",2)

Allan Cameron 的答案顯然是正確的,只需要基礎 R,只是為了后代,這里是整潔的版本。

example_db <- data.frame(name=c("A","B","C"), 
                         value_1=c(1,2,3), 
                         value_2=c(2,3,1))



advanced_filter <- function(data,variable,limit){
  require(dplyr)
  vbl <- enquo(variable)
  data %>% 
    dplyr::filter(!!vbl > limit) 
}

advanced_filter(example_db,value_1,2)
#> Loading required package: dplyr
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
#>   name value_1 value_2
#> 1    C       3       1

代表 package (v2.0.1) 於 2022 年 1 月 28 日創建

或者,按照下面@TimTeaFan 的評論:

example_db <- data.frame(name=c("A","B","C"), 
                         value_1=c(1,2,3), 
                         value_2=c(2,3,1))



advanced_filter <- function(data,variable,limit){
  require(dplyr)
  data %>% 
    dplyr::filter({{variable}} > limit) 
}

advanced_filter(example_db,value_1,2)
#> Loading required package: dplyr
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
#>   name value_1 value_2
#> 1    C       3       1

代表 package (v2.0.1) 於 2022 年 1 月 28 日創建

也許您正在使這比需要的更復雜:

advanced_filter <- function(data, variable, limit) {
  data[data[variable] > limit,]
}

advanced_filter(example_db, "value_1", 2)
#>   name value_1 value_2
#> 3    C       3       1

代表 package (v2.0.1) 於 2022 年 1 月 28 日創建

如果您希望能夠將向量名稱用作字符串,可以是完全限定的 - 或僅用作符號,您可以使用以下 Base R 解決方案:

# Function:
advanced_filter <- function(data, variable, limit) {
  if(is.character(substitute(variable))){
    variable_str <- variable
  }else{
    variable_str <- gsub(".*\\$", "", deparse(substitute(variable)))
  }
  res <- data[data[,variable_str] > limit,]
  return(res)
}
# Application:
advanced_filter(example_db, "value_1", 2)
advanced_filter(example_db, value_1, 2)
advanced_filter(example_db, example_db$value_1, 2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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