dplyr::在自制函数中找不到选择对象
我正在努力学习如何使用函数使我的代码更易于阅读和回忆。我正在练习一个函数,该函数期望根据函数参数之一使用过滤器对我的数据进行子集划分,只保留我提供给函数的部分数据列,并使用ggplot+geom_线选择和绘制索引随时间的趋势 我发现了几个相关的问题,但我无法解决其中任何一个问题。我认为我的问题与我在函数本身中包含参数的方式有关。由于我对用R编写函数非常陌生,而且在某种程度上,对R本身来说,我想了解我遗漏了什么 以下是我使用dput获得的数据样本: 职能: 我正在使用的函数有3个参数:我称之为data.moving的数据集和2个附加项:一个用于根据denominazione_regione列对数据进行子集,另一个用于选择随时间绘制哪个索引。我向函数提供的帧有3个可能的索引dplyr::在自制函数中找不到选择对象,r,function,ggplot2,dplyr,R,Function,Ggplot2,Dplyr,我正在努力学习如何使用函数使我的代码更易于阅读和回忆。我正在练习一个函数,该函数期望根据函数参数之一使用过滤器对我的数据进行子集划分,只保留我提供给函数的部分数据列,并使用ggplot+geom_线选择和绘制索引随时间的趋势 我发现了几个相关的问题,但我无法解决其中任何一个问题。我认为我的问题与我在函数本身中包含参数的方式有关。由于我对用R编写函数非常陌生,而且在某种程度上,对R本身来说,我想了解我遗漏了什么 以下是我使用dput获得的数据样本: 职能: 我正在使用的函数有3个参数:我称之为da
plot_by_reg <- function(df, reg, dato) {
#d <-
df %>%
dplyr::filter(denominazione_regione == reg) %>%
dplyr::mutate(calendario = format(as.Date(paste(mese,giorno , sep = "-" ) , format = "%m-%d" ), "%m-%d")) %>%
dplyr::select(c(denominazione_regione, calendario, all_of(dato))) %>%
ggplot(aes(x=df$calendario, y=df$dato)) + #, group = 1)) +
geom_line(aes(group = 1)) +
theme_dark()
}
相反,如果我更改ggplot美学以调用函数调用中引号中包含的函数参数,我会得到一个图形,其中直线是水平的,在y轴上没有实际值
plot_by_reg <- function(df, reg, dato) {
#d <-
df %>%
dplyr::filter(denominazione_regione == reg) %>%
dplyr::mutate(calendario = format(as.Date(paste(mese,giorno , sep = "-" ) , format = "%m-%d" ), "%m-%d")) %>%
dplyr::select(c(denominazione_regione, calendario, all_of(dato))) #%>%
ggplot(aes(x = calendario, y = dato) + #, group = 1)) +
geom_line(aes(group = 1)) +
theme_dark()
}
我认为问题在于我在函数中调用函数参数的方式,但是只要我试图改变它,我总是发现一个错误。例如,如果我试图传递参数dato,而不是,R在plot_中抛出一个错误,因为它没有找到元素df$dato。函数外部的相同命令可以完美地工作
编辑
我忘了提到我正在使用的机器的功能:
Sys.info()
sysname release version nodename machine login
"Windows" "10 x64" "build 18362" "DESKTOP-7D7TTKL" "x86-64" "Filippo"
user effective_user
"Filippo" "Filippo"
R.version
_
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 6.2
year 2019
month 12
day 12
svn rev 77560
language R
version.string R version 3.6.2 (2019-12-12)
nickname Dark and Stormy Night
library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0 v purrr 0.3.3
v tibble 2.1.3 v dplyr 0.8.4
v tidyr 1.0.2 v stringr 1.4.0
v readr 1.3.1 v forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
Warning messages:
1: package ‘tidyverse’ was built under R version 3.6.3
2: package ‘ggplot2’ was built under R version 3.6.3
你能在提问时提供数据真是太好了。然而,我很难理解你的变量是什么意思,因为我不会说意大利语。但是,我可以看到代码中出现了一些错误。例如,您需要一个特殊的{}符号来使用dplyr和ggplot2生成函数。请参阅下面的链接。我有som示例代码,您可以查看或模拟。祝你好运
library(tidyverse)
Plot <- function(data,xvar,yvar){
ggplot({{data}},aes({{xvar}},{{yvar}})) +
geom_point()
}
Plot(mtcars,mpg,hp)
Wrangle <- function(data,var1,var2){
data %>%
select({{var1}},{{var2}})
}
Wrangle(mtcars,hp,mpg)
Combo <- function(data,var1,var2){
a <- data %>%
select({{var1}},{{var2}}) %>%
ggplot(aes({{var1}},{{var2}})) +
geom_point()
b <- data %>%
select({{var1}},{{var2}})
print(a)
print(b)
}
Combo(mtcars,hp,mpg)
你能在提问时提供数据真是太好了。然而,我很难理解你的变量是什么意思,因为我不会说意大利语。但是,我可以看到代码中出现了一些错误。例如,您需要一个特殊的{}符号来使用dplyr和ggplot2生成函数。请参阅下面的链接。我有som示例代码,您可以查看或模拟。祝你好运
library(tidyverse)
Plot <- function(data,xvar,yvar){
ggplot({{data}},aes({{xvar}},{{yvar}})) +
geom_point()
}
Plot(mtcars,mpg,hp)
Wrangle <- function(data,var1,var2){
data %>%
select({{var1}},{{var2}})
}
Wrangle(mtcars,hp,mpg)
Combo <- function(data,var1,var2){
a <- data %>%
select({{var1}},{{var2}}) %>%
ggplot(aes({{var1}},{{var2}})) +
geom_point()
b <- data %>%
select({{var1}},{{var2}})
print(a)
print(b)
}
Combo(mtcars,hp,mpg)
您的功能有两个问题。第一个错误是因为calendario不是传递给函数的df列。在指定美学时,只需删除df$。第二即使在删除df$时,您也可以将y值设置为变量dato中的字符串,即示例中的indice_covid。也就是说,对于每个日期,您都有相同的值标识。这就是为什么你会得到一条平线。要告诉ggplot2需要df的列数据,必须使用sym和bang bang运算符将其转换为符号!!,即!!西姆达托。试试这个: 图书馆GGPLOT2 图书馆弹琴 按百分比绘图 dplyr::filterdenominazione_regione==reg%>% dplyr::mutatecalendario=formatas.datePasteme,giorno,sep=-,格式=%m-%d,%m-%d%>% dplyr::选择CDENOMINAZIONE\u regione、calendario、所有数据%>% ggplotaesx=df$calendario,y=df$dato+ ggplotaesx=日历,y=!!西姆达托+ geom_LineasGroup=1+ 黑暗的主题 } 绘图方式为regdf=data.moving,reg=Toscana,dato=indice\U covid
由v0.3.0于2020年5月25日创建,您的功能有两个问题。第一个错误是因为calendario不是传递给函数的df列。在指定美学时,只需删除df$。第二即使在删除df$时,您也可以将y值设置为变量dato中的字符串,即示例中的indice_covid。也就是说,对于每个日期,您都有相同的值标识。这就是为什么你会得到一条平线。要告诉ggplot2需要df的列数据,必须使用sym和bang bang运算符将其转换为符号!!,即!!西姆达托。试试这个: 图书馆GGPLOT2 图书馆弹琴 按百分比绘图 dplyr::filterdenominazione_regione==reg%>% dplyr::mutatecalendario=formatas.datePasteme,giorno,sep=-,格式=%m-%d,%m-%d%>% dplyr::选择CDENOMINAZIONE\u regione、calendario、所有数据%>% ggplotaesx=df$calendario,y=df$dato+ ggplotaesx=日历,y=!!西姆达托+ geom_LineasGroup=1+ 黑暗的主题 } 绘图方式为regdf=data.moving,reg=Toscana,dato=indice\U covid
由v0.3.0于2020年5月25日创建Hi@stefan,非常感谢。成功了!抱歉,如果我一直问,但我还有两个奇怪的地方:首先,你说calendario不是df的一部分,但我在函数中创建了它。这是一个函数
n只考虑原始列作为数据的PERT?第二,关于sys和bang-bang!!操作符:为什么我不必使用它们,比如说,函数的另一个参数?这是因为它们在被传递到的命令中是必需的字符串吗?Hi@filipponati。问也可以1.在管道中创建变量不会将变量添加到原始df中,它只存储在内存中的某种临时df中。如果要添加到原始df,必须将结果分配给df,即df%。。。。。然后将变异的df传递给ggplot。。。。。。2.你是对的。在filterdenominazione_regione==reg的情况下,我们不需要转换,因为这里reg作为字符串就可以了。然而,在dato的情况下,我们希望R将字符串解释为变量名或符号,这就是sym所做的,并告诉ggplot在数据帧中查找此变量,这就是!!他正在做什么。有关此功能的更多信息,请参见@MagnusNordmoThanks@stefan提供的链接,现在我对函数的许多了解都没有意义!BestHi@stefan,非常感谢。成功了!抱歉,如果我一直问,但我还有两个奇怪的地方:首先,你说calendario不是df的一部分,但我在函数中创建了它。这个函数只考虑原始列作为数据的PERT吗?第二,关于sys和bang-bang!!操作符:为什么我不必使用它们,比如说,函数的另一个参数?这是因为它们在被传递到的命令中是必需的字符串吗?Hi@filipponati。问也可以1.在管道中创建变量不会将变量添加到原始df中,它只存储在内存中的某种临时df中。如果要添加到原始df,必须将结果分配给df,即df%。。。。。然后将变异的df传递给ggplot。。。。。。2.你是对的。在filterdenominazione_regione==reg的情况下,我们不需要转换,因为这里reg作为字符串就可以了。然而,在dato的情况下,我们希望R将字符串解释为变量名或符号,这就是sym所做的,并告诉ggplot在数据帧中查找此变量,这就是!!他正在做什么。有关此功能的更多信息,请参见@MagnusNordmoThanks@stefan提供的链接,现在我对函数的许多了解都没有意义!谢谢@Magnus Nordmo,我会调查一下{{}特殊操作员!谢谢@Magnus Nordmo,我会调查一下{{}特别接线员!
Sys.info()
sysname release version nodename machine login
"Windows" "10 x64" "build 18362" "DESKTOP-7D7TTKL" "x86-64" "Filippo"
user effective_user
"Filippo" "Filippo"
R.version
_
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 6.2
year 2019
month 12
day 12
svn rev 77560
language R
version.string R version 3.6.2 (2019-12-12)
nickname Dark and Stormy Night
library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0 v purrr 0.3.3
v tibble 2.1.3 v dplyr 0.8.4
v tidyr 1.0.2 v stringr 1.4.0
v readr 1.3.1 v forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
Warning messages:
1: package ‘tidyverse’ was built under R version 3.6.3
2: package ‘ggplot2’ was built under R version 3.6.3
library(tidyverse)
Plot <- function(data,xvar,yvar){
ggplot({{data}},aes({{xvar}},{{yvar}})) +
geom_point()
}
Plot(mtcars,mpg,hp)
Wrangle <- function(data,var1,var2){
data %>%
select({{var1}},{{var2}})
}
Wrangle(mtcars,hp,mpg)
Combo <- function(data,var1,var2){
a <- data %>%
select({{var1}},{{var2}}) %>%
ggplot(aes({{var1}},{{var2}})) +
geom_point()
b <- data %>%
select({{var1}},{{var2}})
print(a)
print(b)
}
Combo(mtcars,hp,mpg)