如何在 R 中编写一个函数,其中一个输入要用引号引起来? (" ")

How to write a function in R where one of the inputs is meant to go in quotation marks? (" ")

让我们以这个假设的代码为例:

```{r}
dataset_custom <- function(top, dataset, variable) {
 {{dataset}} %>%
  count({{variable}}) %>%
  top_n(top, n) %>%
  arrange(-n) %>%
  left_join({{dataset}}, by = "{{variable}}")
}
```

我知道当我尝试 运行(比如)dataset_custom(5, dataset, variable) 时,这会 return 出错,因为 left_join 中的 by = "{{variable}}"。我该如何解决这个问题?

我知道当你离开 join 并且你想通过一个特定的变量加入它时,you do by = "variable" 其中 variable 有引号,但是当我把它写成一个函数,我希望引号中的内容根据我要创建的函数的输入而改变?

谢谢!

如果您提供一些玩具数据(如 ?left_join 示例中的数据),这将很有用。请注意 left_join(df1, df1) 只是 df1。相反,我们可以使用第二个数据参数。

df1 <- tibble(x = 1:3, y = c("a", "a", "b"))
df2 <- tibble(x = c(1, 1, 2), z = c("first", "second", "third"))
df1 %>% left_join(df2, by = "x")

f <- function(data, data2, variable) {
  var <- deparse(substitute(variable))
  data %>%
    count({{ variable }}) %>%
    arrange(-n) %>%
    left_join(data2, by = var)
}

f(df1, df2, x)
      x     n z     
  <dbl> <int> <chr> 
1     1     1 first 
2     1     1 second
3     2     1 third 
4     3     1 NA 

# and
f(df2, df1, x)
      x     n y    
  <dbl> <int> <chr>
1     1     2 a    
2     2     1 a   

为此,我们需要使用 defusing operations 才能正确评估输入。形象地说,使用 {{ }} 作为 by 参数就像使用锤子而不是砂纸来打磨东西——这是一种强制操作,应该发生 none。