英文:
How to pass parameters of facet_grid() in a function?
问题
以下是您提供的代码的翻译部分:
让我们假设我有以下数据集。
library(ggplot2)
test_data <- rnorm(40, 4, 3)
factory <- sample(c("A", "B", "C"), 40, replace = TRUE)
df <- data.frame(test_data, factory)
并且我有一个创建图表的函数,如下所示:
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
graph <- ggplot(data_set, aes(x=seq(length({{y_axis_parameter}})), y={{y_axis_parameter}},
colour= {{category}})) +
geom_line() +
geom_point() +
facet_grid(.~{{category}}) +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(legend.position = "none")
graph
}
graph_builder(df, test_data, category, "Test graph")
这段代码的所有行都能正常工作,除了 facet_grid()。我假设将列名传递给双大括号{{}}会起作用。然而,似乎 facet_grid() 不支持以这种方式传递列名。
我该如何解决这个问题?
英文:
Lets say I have the following dataset.
library(ggplot2)
test_data <- rnorm(40, 4, 3)
factory <- sample(c("A", "B", "C"), 40, replace = TRUE)
df <- data.frame(test_data, factory)
And I have a function that creates a graph such as following:
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
graph <- ggplot(data_set, aes(x=seq(length({{y_axis_parameter}})), y={{y_axis_parameter}},
colour= {{category}})) +
geom_line() +
geom_point() +
facet_grid(.~{{category}}) +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(legend.position = "none")
graph
}
graph_builder(df, test_data, category, "Test graph" )
This code functions correctly in all lines except for facet_grid(). I assumed that passing the column name in double curly braces {{}} would work. However, it appears that facet_grid() does not support passing the column name in this manner.
How can I resolve this issue?
答案1
得分: 2
我建议传递一个原始变量名称,比如 factory
,然后将其放在大括号中传递给 facet_grid
的 rows
和/或 cols
参数:
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
graph <- ggplot(data_set, aes(x=seq(length({{y_axis_parameter}})), y={{y_axis_parameter}},
colour= {{category}})) +
geom_line() +
geom_point() +
facet_grid(rows = vars({{category}})) +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(legend.position = "none")
graph
}
graph_builder(df, test_data, factory, "Test graph" )
[![enter image description here][1]][1]
<details>
<summary>英文:</summary>
I'd recommend passing a raw variable name like `factory`, and feeding that in curly braces to the `rows` and/or `cols` parameters of `facet_grid`:
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
graph <- ggplot(data_set, aes(x=seq(length({{y_axis_parameter}})), y={{y_axis_parameter}},
colour= {{category}})) +
geom_line() +
geom_point() +
facet_grid(rows = vars({{category}})) +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(legend.position = "none")
graph
}
graph_builder(df, test_data, factory, "Test graph" )
[![enter image description here][1]][1]
[1]: https://i.stack.imgur.com/ckPoD.png
</details>
# 答案2
**得分**: 0
在R中,`rlang`包的`sym()`函数可用于将字符串转换为符号。然后,我们可以使用`!!`运算符来取消引用该符号。这使我们能够以编程方式将变量传递给ggplot美学或其他通常不将字符串作为变量名进行评估的参数。在这种情况下,我们可以使用这种方法基于变量列名称创建`facet_grid`。
```R
library(ggplot2)
library(rlang)
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
y_var <- enquo(y_axis_parameter)
category_var <- sym(category)
graph <- ggplot(data_set, aes(x = seq_along(!!y_var), y = !!y_var, colour = !!category_var)) +
geom_line() +
geom_point() +
facet_grid(. ~ !!category_var) +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(legend.position = "none")
graph
}
graph_builder(df, test_data, "factory", "Test graph")
在上述函数中,enquo()
用于引用y_axis_parameter
,以便在整洁评估环境中使用(通过!!
运算符)。sym()
函数用于将类别参数转换为符号,以便可以使用!!
取消引用并在facet_grid()
内进行评估。
英文:
In R, the rlang
package's sym()
function can be used to convert a string into a symbol. We can then use the !!
operator to unquote the symbol. This allows us to programmatically pass variables to ggplot aesthetics or other arguments which typically do not evaluate strings as variable names. In this case, we can use this method to create a facet_grid
based on a variable column name.
library(ggplot2)
library(rlang)
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
y_var <- enquo(y_axis_parameter)
category_var <- sym(category)
graph <- ggplot(data_set, aes(x = seq_along(!!y_var), y = !!y_var, colour = !!category_var)) +
geom_line() +
geom_point() +
facet_grid(. ~ !!category_var) +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(legend.position = "none")
graph
}
graph_builder(df, test_data, "factory", "Test graph")
In the function above enquo()
is used to quote the y_axis_parameter
so it can be used in a tidy evaluation context (via the !!
operator). The sym()
function is used to convert the category argument to a symbol, so it can be unquoted with !!
and evaluated within facet_grid()
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论