R 缺少参数,没有默认值,但仅在循环中
我编写了两个简单的自定义函数,目的是将它们合并到一个特定的函数中 这些用于对数据进行子集划分。第一个不太具体:R 缺少参数,没有默认值,但仅在循环中,r,loops,R,Loops,我编写了两个简单的自定义函数,目的是将它们合并到一个特定的函数中 这些用于对数据进行子集划分。第一个不太具体: unspecific_subsetting=function(x,var1,var2){ subset(x, x$COL1 %in% var1 & x$COL2 %in% var2 & x$COL3 %in% "A") } 在x$COL3中,我放置了“A”,因为它是常量。第二个更具体,它做完全相同的事情,但它只包含选定的行:
unspecific_subsetting=function(x,var1,var2){
subset(x, x$COL1 %in% var1
& x$COL2 %in% var2
& x$COL3 %in% "A")
}
在x$COL3
中,我放置了“A”
,因为它是常量。第二个更具体,它做完全相同的事情,但它只包含选定的行:
specific_subsetting=function(x,var1,var2,year){
subset(x, x$COL1 %in% var1
& x$COL2 %in% var2
& x$COL3 %in% "A"
& x$COL4 %in% (year+1))
}
我写了(year+1)
,但稍后我可能也会将其更改为variable。我使用的最后一个函数是简单的百分比变化:
pcchange=function(x){ c( NA, diff(x)/x[-length(x)] ) }
所以现在是时候解释了——我希望将所有这些函数组合成一个方便的函数,它计算某些减分数据集的百分比变化,然后从所选行返回pcchange值。看起来是这样的:
big_function=function(x,var1,var2,year){
x=unspecific_subsetting(x, var1, var2)
x=data.frame(x,"growth"=(pcchange(x$COLn)*100))
x=getforecast(x,var1,var2,year)}
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),var1,var2,year.list[i])}
COL1 COL2 COL3 COL4 COLn
CarBrand1 Gas A 2014 5.34
CarBrand1 Gas A 2010 1.46
CarBrand1 Gas A 2007 1.18
CarBrand1 Diesel A 2006 1.27
CarBrand1 Electric A 2013 1.78
CarBrand1 Electric A 2001 1.44
CarBrand2 Electric A 2007 1.39
CarBrand2 Diesel A 2004 1.04
CarBrand2 Gas A 2009 1.89
CarBrand2 Gas A 2004 1.83
CarBrand2 Electric A 2000 1.69
CarBrand2 Electric A 2001 1.61
CarBrand2 Electric A 2013 1.29
CarBrand2 Diesel A 2001 2.00
CarBrand2 Diesel A 2006 1.78
CarBrand2 Gas A 2010 1.10
CarBrand2 Gas A 2002 1.51
CarBrand2 Gas A 2012 1.78
CarBrand2 Electric A 2009 1.84
CarBrand3 Gas A 2013 1.24
CarBrand3 Gas A 2009 1.98
CarBrand3 Gas A 2015 1.91
CarBrand3 Gas A 2007 1.14
CarBrand3 Diesel A 2000 1.54
CarBrand3 Diesel A 2013 1.60
newdf=0
output=0
NEW.df.names.list=c("output")
df.names.list=c("mydf")
year.list=2012
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),"CarBrand3","Diesel",year.list[i])}
更具体地说,它基本上是对数据的某些部分进行子集化,然后计算并向df添加带有pcchanges的新列,最后返回所需的行。这个功能有效。而且很有魅力。当我把它放入循环时,问题就开始了。到目前为止,我是基于列表编写循环的,所以看起来是这样的:
big_function=function(x,var1,var2,year){
x=unspecific_subsetting(x, var1, var2)
x=data.frame(x,"growth"=(pcchange(x$COLn)*100))
x=getforecast(x,var1,var2,year)}
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),var1,var2,year.list[i])}
COL1 COL2 COL3 COL4 COLn
CarBrand1 Gas A 2014 5.34
CarBrand1 Gas A 2010 1.46
CarBrand1 Gas A 2007 1.18
CarBrand1 Diesel A 2006 1.27
CarBrand1 Electric A 2013 1.78
CarBrand1 Electric A 2001 1.44
CarBrand2 Electric A 2007 1.39
CarBrand2 Diesel A 2004 1.04
CarBrand2 Gas A 2009 1.89
CarBrand2 Gas A 2004 1.83
CarBrand2 Electric A 2000 1.69
CarBrand2 Electric A 2001 1.61
CarBrand2 Electric A 2013 1.29
CarBrand2 Diesel A 2001 2.00
CarBrand2 Diesel A 2006 1.78
CarBrand2 Gas A 2010 1.10
CarBrand2 Gas A 2002 1.51
CarBrand2 Gas A 2012 1.78
CarBrand2 Electric A 2009 1.84
CarBrand3 Gas A 2013 1.24
CarBrand3 Gas A 2009 1.98
CarBrand3 Gas A 2015 1.91
CarBrand3 Gas A 2007 1.14
CarBrand3 Diesel A 2000 1.54
CarBrand3 Diesel A 2013 1.60
newdf=0
output=0
NEW.df.names.list=c("output")
df.names.list=c("mydf")
year.list=2012
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),"CarBrand3","Diesel",year.list[i])}
因此,正如您所看到的,我正在尝试创建新的dfs,每个dfs只包含选定的行(顺便说一句:我知道我的“子集”函数在big\u函数中重叠,但我不介意)。这将返回一个错误:
Error in unspecific_subsetting(x, var1, var2) :
argument "var1" is missing, with no default
我检查过,这个问题考虑了每个函数中的每一个参数,它只返回了第一个R。
我完全不知道这里的问题是什么,我用过几次类似的循环,从来没有这样的结果 我设法重现了测试数据上的错误。我的测试结果如下所示:
big_function=function(x,var1,var2,year){
x=unspecific_subsetting(x, var1, var2)
x=data.frame(x,"growth"=(pcchange(x$COLn)*100))
x=getforecast(x,var1,var2,year)}
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),var1,var2,year.list[i])}
COL1 COL2 COL3 COL4 COLn
CarBrand1 Gas A 2014 5.34
CarBrand1 Gas A 2010 1.46
CarBrand1 Gas A 2007 1.18
CarBrand1 Diesel A 2006 1.27
CarBrand1 Electric A 2013 1.78
CarBrand1 Electric A 2001 1.44
CarBrand2 Electric A 2007 1.39
CarBrand2 Diesel A 2004 1.04
CarBrand2 Gas A 2009 1.89
CarBrand2 Gas A 2004 1.83
CarBrand2 Electric A 2000 1.69
CarBrand2 Electric A 2001 1.61
CarBrand2 Electric A 2013 1.29
CarBrand2 Diesel A 2001 2.00
CarBrand2 Diesel A 2006 1.78
CarBrand2 Gas A 2010 1.10
CarBrand2 Gas A 2002 1.51
CarBrand2 Gas A 2012 1.78
CarBrand2 Electric A 2009 1.84
CarBrand3 Gas A 2013 1.24
CarBrand3 Gas A 2009 1.98
CarBrand3 Gas A 2015 1.91
CarBrand3 Gas A 2007 1.14
CarBrand3 Diesel A 2000 1.54
CarBrand3 Diesel A 2013 1.60
newdf=0
output=0
NEW.df.names.list=c("output")
df.names.list=c("mydf")
year.list=2012
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),"CarBrand3","Diesel",year.list[i])}
前两列是汽车品牌和发动机类型,第三列是常数,第四列是年份,最后一列是随机值。我将自定义函数完全像第一篇文章一样放入R中,因此我的测试代码如下所示:
big_function=function(x,var1,var2,year){
x=unspecific_subsetting(x, var1, var2)
x=data.frame(x,"growth"=(pcchange(x$COLn)*100))
x=getforecast(x,var1,var2,year)}
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),var1,var2,year.list[i])}
COL1 COL2 COL3 COL4 COLn
CarBrand1 Gas A 2014 5.34
CarBrand1 Gas A 2010 1.46
CarBrand1 Gas A 2007 1.18
CarBrand1 Diesel A 2006 1.27
CarBrand1 Electric A 2013 1.78
CarBrand1 Electric A 2001 1.44
CarBrand2 Electric A 2007 1.39
CarBrand2 Diesel A 2004 1.04
CarBrand2 Gas A 2009 1.89
CarBrand2 Gas A 2004 1.83
CarBrand2 Electric A 2000 1.69
CarBrand2 Electric A 2001 1.61
CarBrand2 Electric A 2013 1.29
CarBrand2 Diesel A 2001 2.00
CarBrand2 Diesel A 2006 1.78
CarBrand2 Gas A 2010 1.10
CarBrand2 Gas A 2002 1.51
CarBrand2 Gas A 2012 1.78
CarBrand2 Electric A 2009 1.84
CarBrand3 Gas A 2013 1.24
CarBrand3 Gas A 2009 1.98
CarBrand3 Gas A 2015 1.91
CarBrand3 Gas A 2007 1.14
CarBrand3 Diesel A 2000 1.54
CarBrand3 Diesel A 2013 1.60
newdf=0
output=0
NEW.df.names.list=c("output")
df.names.list=c("mydf")
year.list=2012
for (i in 1:length(df.names.list)){
assign(NEW.df.names.list[i],big_function(get(df.names.list[i])),"CarBrand3","Diesel",year.list[i])}
我在多个dfs上工作,这只会导致on循环,但它会给我完全相同的错误。我知道这并不是完全回答我自己的问题,它更像是扩展…你能提供一些数据吗?首先要检查的是:当错误发生时,你在var1
中有什么?我使用“回答你的问题”使文章更容易写。