为什么我的过滤器出现错误? filter_impl(.data,quo)中的错误:评估错误:找不到对象

时间:2019-03-06 00:00:21

标签: r function filter dplyr

我正在尝试编写一个函数,该函数将对我要对数据帧的其他变量执行的某些计算自动化。

这是我的数据框,如下所示:

head(SoilGeology, n=5)  
# A tibble: 5 x 12
  Year  Zone            SubZone         Au_ppm Ag_ppm Cu_ppm Pb_ppm Zn_ppm As_ppm Sb_ppm Bi_ppm Mo_ppm
  <chr> <chr>           <chr>            <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 1990  BugLake         BugLake          0.007    3.7     17     27     23      1      1     NA      1
2 1983  Johnny Mountain Johnny Mountain  0.01     1.6     71     63    550      4     NA     NA     NA
3 1983  Khyber Pass     Khyber Pass      0.12    11.5    275    204   8230    178      7     60     NA
4 1987  Chebry          Ridge Line Grid  0.05     2.2     35     21    105     16      6     NA     NA
5 1987  Chebry          Handel Grid      0.004    1.3     29     27    663     45      2     NA     NA

我编写的函数如下:

library(dplyr)
my_function <- function(df, st, elt){  

# df = data frame, str = element in string form, elt = element

  # tests
  if(!is.data.frame(df)){
    print("The table is not a data frame.")
    return(NULL)}  

  if(!is.character(st)){
     print('st is not in string form.')
     return(NULL)}

  if(!(st %in% colnames(df))){ 
    print("The element is not in the data frame.")
    return(NULL)}

  x <- list() # create our output list

  # Summary statistics
  x$stat <- df %>%
    filter(!is.na(elt)) %>%
    group_by(Year, Zone, SubZone) %>%
    summarise(
      n = sum(!is.na(elt)),
      min = min(elt),
      max = max(elt),
      mean = mean(elt),
      sd = sd(elt))

  # Boxplot
  x$boxplot <- df %>%
    group_by(Year, Zone, SubZone) %>%
    filter(n() > 40 & !is.na(elt)) %>%
    ggplot(df, mapping = aes(Zone, elt, color = Year)) +
    geom_boxplot() +
    scale_y_log10() +
    coord_flip()

  return(x)
}

我写作时遇到以下错误

Ag <- summary_statistics(SoilGeology,'Ag_ppm', Ag_ppm)
Error in filter_impl(.data, quo) : 
  Evaluation error: object 'Ag_ppm' not found.

在功能之外,我的代码工作正常。

关于为什么我的功能无法正常工作的任何见解?

1 个答案:

答案 0 :(得分:0)

问题可能是由于dplyr中的非标准评估(NSE)

您可以查看此链接,非常有启发性: Programming with dplyr

适合您情况的简短答案(应该有效):

  • 在函数中,将输入转换为“ quosure”:在函数的开头插入:elt <- enquo(elt)
  • x$statsx$boxplot中,通过用elt替换!! elt来“整理评估”输入

您还可以查看此link,其中提供了有用的见解。