Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr::在自制函数中找不到选择对象_R_Function_Ggplot2_Dplyr - Fatal编程技术网

dplyr::在自制函数中找不到选择对象

dplyr::在自制函数中找不到选择对象,r,function,ggplot2,dplyr,R,Function,Ggplot2,Dplyr,我正在努力学习如何使用函数使我的代码更易于阅读和回忆。我正在练习一个函数,该函数期望根据函数参数之一使用过滤器对我的数据进行子集划分,只保留我提供给函数的部分数据列,并使用ggplot+geom_线选择和绘制索引随时间的趋势 我发现了几个相关的问题,但我无法解决其中任何一个问题。我认为我的问题与我在函数本身中包含参数的方式有关。由于我对用R编写函数非常陌生,而且在某种程度上,对R本身来说,我想了解我遗漏了什么 以下是我使用dput获得的数据样本: 职能: 我正在使用的函数有3个参数:我称之为da

我正在努力学习如何使用函数使我的代码更易于阅读和回忆。我正在练习一个函数,该函数期望根据函数参数之一使用过滤器对我的数据进行子集划分,只保留我提供给函数的部分数据列,并使用ggplot+geom_线选择和绘制索引随时间的趋势

我发现了几个相关的问题,但我无法解决其中任何一个问题。我认为我的问题与我在函数本身中包含参数的方式有关。由于我对用R编写函数非常陌生,而且在某种程度上,对R本身来说,我想了解我遗漏了什么

以下是我使用dput获得的数据样本:

职能:

我正在使用的函数有3个参数:我称之为data.moving的数据集和2个附加项:一个用于根据denominazione_regione列对数据进行子集,另一个用于选择随时间绘制哪个索引。我向函数提供的帧有3个可能的索引

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)