如何在 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。
让我们以这个假设的代码为例:
```{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。