1

按照 Hadley Wickams' r for data science中的指导,我想将参数数据帧传递给用户定义的函数。

但是,由于参数存储为数据帧(df_params)中的字符,因此我在评估时遇到了麻烦 - 特别是评估我的 df 参数。例如,这是一个函数:

`f <- function(df, group1, region1) {
        g1 <- as.name(group1)
        reg1 <- enquo(region1)
        x <- filter(df, (!!g1) == !!reg1) %>% select(country) 
       print(x)
    } 

我通过 f(df, 'group', 'region') 没有问题。但是,我希望 f('df', 'group', 'region') 将 'df' 评估为我的全局环境中的对象而不是字符。

我假设(希望)通过解决这个问题,我将能够通过

df_params %>% pmap(f)

任何帮助表示赞赏。

4

1 回答 1

0

你没有提供数据,所以我创建了一些假数据来演示这个解决方案。您正在寻找的可能是get()功能。

首先是一些虚假数据

> df1 <- data.frame(animal1 = rep(c('cat','dog'),5),
+                   animal2 = c(rep(c('cat','snake','dog'),3), 'dog'),
+                   country = c('USA','USA','USA','NK','NK','NK','NK','USA','MEX','MEX'),
+                   stringsAsFactors = F)

   animal1 animal2 country
1      cat     cat     USA
2      dog   snake     USA
3      cat     dog     USA
4      dog     cat      NK
5      cat   snake      NK
6      dog     dog      NK
7      cat     cat      NK
8      dog   snake     USA
9      cat     dog     MEX
10     dog     dog     MEX

这是您当前的函数,它提供以下输出:

> f <- function(df, group1, region1) {
+   g1 <- as.name(group1)
+   reg1 <- enquo(region1)
+   x <- filter(df, (!!g1) == !!reg1) %>% select(country) 
+   print(x)
+ } 
> 
> f(df1, 'animal1', 'dog')
  country
1     USA
2      NK
3      NK
4     USA
5     MEX

get(df)我们可以通过简单地添加到您的过滤器功能来修改它。你可以看到它给了我们相同的输出。

> f2 <- function(df, group1, region1) {
+   g1 <- as.name(group1)
+   reg1 <- enquo(region1)
+   x <- filter(get(df), (!!g1) == !!reg1) %>% select(country) 
+   print(x)
+ } 
> 
> f2('df1', 'animal1', 'dog')
  country
1     USA
2      NK
3      NK
4     USA
5     MEX
于 2018-02-27T00:28:54.627 回答