R:IF语句在条件为FALSE的情况下计算表达式?

R:IF语句在条件为FALSE的情况下计算表达式?,r,if-statement,nested,match,R,If Statement,Nested,Match,我在R中有一个很大的函数,用户可以不包含/指定对象。如果是,代码将进行检查,以确保该对象中的名称与另一个对象中的名称匹配。如果他们没有,就没有必要进行检查。代码行是: if(exists("grids")) if(!all(expvarnames %in% names(grids))) {stop("Not all expvar column names found as column names in grids")} 但我得到了以下错误: Error in match(x, table,

我在R中有一个很大的函数,用户可以不包含/指定对象。如果是,代码将进行检查,以确保该对象中的名称与另一个对象中的名称匹配。如果他们没有,就没有必要进行检查。代码行是:

if(exists("grids")) if(!all(expvarnames %in% names(grids))) {stop("Not all expvar column names found as column names in grids")}
但我得到了以下错误:

Error in match(x, table, nomatch = 0L) : argument "grids" is missing, with no default
在这次试运行中,网格应该丢失了。如果我尝试

if(exists("grids")) print("yay")
然后什么也不打印,即缺少网格意味着表达式没有计算,这是我所期望的。那么,有人能想一想为什么在主示例中R似乎在评估后续的IF语句吗?我应该在第二个括号上再加一个花括号吗

谢谢

编辑:更多问题。从变量的函数列表中删除“grids”,意味着如果没有称为grids的对象,并且您没有在调用中指定它(即
函数(x,grids=which)
),那么它就可以工作。在变量的函数列表中保留“grids”,意味着如果有一个名为grids的对象,并且您在调用中指定了它,那么它就可以工作

请看这个:

使用
exists(grids)
是不可行的,因为exists需要“引号”,如果没有em,一切都会失败。有了它们(“网格”),我需要决定是否在函数列表中保留“网格”。如果我没有,但我在调用
(函数(x,grids=which))
中指定了它,那么我将得到未使用的参数fail。如果我这样做了,但没有在调用中指定它,因为网格不存在并且我不想使用它,我会得到匹配错误,网格没有默认值

我该怎么做?可能在函数变量列表中将其列为
grids=“NULL”
,而不是
if(exists(“grids”)
do
if(grids!=“NULL”)

我仍然不知道为什么最初的比赛问题会发生。匹配来自expvarnames/grids names checker,它位于
if(exists(“grids”)
之后,计算结果为FALSE。WAAAAAIIITTTT。。。。。如果我在函数变量列表中指定网格,即简单地将
函数(x,网格等){do stuff}
,这是否意味着函数在其环境中创建一个称为网格的对象? 伙计,这太糟糕了

testfun <- function(x,grids)
{if(exists("grids")) globalgrids<<-grids
print(x+1)}
testfun(1) # Error in testfun(1) : argument "grids" is missing, with no default

testfun <- function(x,grids)
{if(exists("grids")) a<<-c(1,2,3)
  print(x+1)}
testfun(1) #2 (and globally assigns a)

testfun解决方案

调整您的示例使用:

testfun <- function(x,grids = NULL)
{
   if(!is.null(grids)){
     if(!all(expvarnames %in% names(grids))){
       stop("Not all expvar column names found as column names in grids")
     }
     print(x+1)
   }
}
这里我们调用函数
testfun
,只给出
x
参数
testfun
知道它需要两个参数,因此创建局部变量
x
grids
。然后我们给了
x
一个参数,因此它将值赋给
x
网格
没有参数,但是仍然创建了变量,即使没有为其赋值。因此,
网格
存在,但没有价值


从这个
存在(“网格”)
为真
,但当我们尝试执行
全球网格解决方案时

调整您的示例使用:

testfun <- function(x,grids = NULL)
{
   if(!is.null(grids)){
     if(!all(expvarnames %in% names(grids))){
       stop("Not all expvar column names found as column names in grids")
     }
     print(x+1)
   }
}
这里我们调用函数
testfun
,只给出
x
参数
testfun
知道它需要两个参数,因此创建局部变量
x
grids
。然后我们给了
x
一个参数,因此它将值赋给
x
网格
没有参数,但是仍然创建了变量,即使没有为其赋值。因此,
网格
存在,但没有价值


从这个
存在(“网格”)
为真
,但当我们尝试执行
全球网格解决方案时

调整您的示例使用:

testfun <- function(x,grids = NULL)
{
   if(!is.null(grids)){
     if(!all(expvarnames %in% names(grids))){
       stop("Not all expvar column names found as column names in grids")
     }
     print(x+1)
   }
}
这里我们调用函数
testfun
,只给出
x
参数
testfun
知道它需要两个参数,因此创建局部变量
x
grids
。然后我们给了
x
一个参数,因此它将值赋给
x
网格
没有参数,但是仍然创建了变量,即使没有为其赋值。因此,
网格
存在,但没有价值


从这个
存在(“网格”)
为真
,但当我们尝试执行
全球网格解决方案时

调整您的示例使用:

testfun <- function(x,grids = NULL)
{
   if(!is.null(grids)){
     if(!all(expvarnames %in% names(grids))){
       stop("Not all expvar column names found as column names in grids")
     }
     print(x+1)
   }
}
这里我们调用函数
testfun
,只给出
x
参数
testfun
知道它需要两个参数,因此创建局部变量
x
grids
。然后我们给了
x
一个参数,因此它将值赋给
x
网格
没有参数,但是仍然创建了变量,即使没有为其赋值。因此,
网格
存在,但没有价值

从这个
存在(“网格”)
将是
真的
,但是当我们尝试执行
全局网格
>时,如果(存在(“a”))如果(!all(a%在%b中)){停止(“不是b中的所有a”)}
错误:并非所有a都在b中
>rm(a)
>if(exists(“a”))if(!all(a%in%b)){stop(“notall a%in%b”)}
>
a
不存在时,表达式不会按预期进行计算。在测试第一个表达式之前,通过在控制台中运行
rm(grids)
确保
grids
不存在

>a b if(存在(“a”))if(!all(a%in%b)){stop(“不是b中的所有a”)}
错误:并非所有a都在b中
>rm(a)
>if(exists(“a”))if(!all(a%in%b)){stop(“notall a%in%b”)}
>
a
不存在时,表达式不会按预期进行计算。在测试第一个表达式之前,通过在控制台中运行
rm(grids)
确保
grids
不存在

>a b if(存在(“a”))if(!all(a%in%b)){stop(“不是b中的所有a”)}
错误:并非所有a都在b中
>rm(a)
>if(exists(“a”))if(!all(a%in%b)){stop(“notall a%in%b”)}
>
a
不存在时,表达式不会按预期进行计算。
> a <- c(1,2,3,4)
> b <- c(2,4,6,8)
> if(exists("a")) if(!all(a %in% b)) {stop("Not all a in b")}

Error: Not all a in b

> rm(a)
> if(exists("a")) if(!all(a %in% b)) {stop("Not all a in b")}
>