Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
R 停止并返回函数中的对象,而不报告错误_R - Fatal编程技术网

R 停止并返回函数中的对象,而不报告错误

R 停止并返回函数中的对象,而不报告错误,r,R,我试图弄清楚如果if语句在父函数bar中的函数foo中为TRUE,如何返回一个对象,而不是在bar中执行以下代码;如果为FALSE,则在栏中执行以下代码。在下面的函数bar2中,我可以测试foo的输出,然后如果foo的输出为空,则在bar2中执行更多代码。但是,在尝试减少使用的代码行时,我想知道如果函数foo中的if语句为TRUE,我是否可以以某种方式防止在bar函数中打印“howdy”停止可以执行此操作,但发出错误信号,而这不是此处发生的情况。基本上,我在寻找一个等价的stop,但返回一个没有

我试图弄清楚如果if语句在父函数
bar
中的函数
foo
中为TRUE,如何返回一个对象,而不是在
bar
中执行以下代码;如果为FALSE,则在
栏中执行以下代码。在下面的函数
bar2
中,我可以测试
foo
的输出,然后如果
foo
的输出为空,则在
bar2
中执行更多代码。但是,在尝试减少使用的代码行时,我想知道如果函数
foo
中的if语句为TRUE,我是否可以以某种方式防止在
bar
函数中打印“howdy”<代码>停止
可以执行此操作,但发出错误信号,而这不是此处发生的情况。基本上,我在寻找一个等价的
stop
,但返回一个没有错误的对象

foo <- function(x){
  if(x < 10){
    "hello world"
  } else
  { NULL }
}

bar <- function(y){
 foo(y)
 "howdy"
}

bar2 <- function(y){
  out <- foo(y)
  if(!is.null(out)){
    out
  } else
  {
    "howdy"
  }
}

bar(5)
[1] "howdy"

bar2(5)
[1] "hello world"

foo所以
bar
不起作用的原因是范围。您必须执行某种形式的签入
bar
这是不可避免的

您可能要查找的是
return
而不是stop:

bar <- function(y){
 if (!is.null(foo(y))) {
    return("hello world")   # breaks out of the function
 }
 print("this will never print when foo doesn't return NULL")
 "howdy"     # ending part, so it would be returned only if foo(y) != "h..."
}

嗯,我想这不是我要找的。尝试了您的函数,但它们的关键是我希望函数
栏中的
foo(y)
行返回结果,如果if语句为TRUE,则不执行下一行。对,NULL不必返回,它可以是其他的。这是一个简单的愚蠢的例子。第一行现在处理它。这是不可能的!了解范围;内部函数无法控制外部函数中的任何内容(返回对象除外)。因此,可以从
bar
中的
foo
中捕获内容,根据结果,您可以使用
return
跳过
bar
函数中的其余内容。@ScottChamberlain对于含糊不清的解释表示抱歉,但我希望这能有所帮助!请继续提问!您可以让
foo
接受
else\u value=NULL
参数,它将在else部分返回该值。然后
bar
就可以调用
foo(y,else_value=“howdy”)
。啊,好主意。为了简单起见,我遗漏了一行代码打印“howdy”,在我的实际情况中大约是10行代码。否则,该解决方案将起作用,这不应该是一个问题,您可以将该代码放在
{…}
块中,或者更好,将代码放在
z
函数中,然后执行
foo(y,else_value=z())
。请注意,
z()
只有在必要时才会运行,例如,我尝试了
foo(1,else_value={Sys.sleep(10),“howdy”}
,它立即返回
“hello world”
。传递函数调用或
{…}
块很好。这是解决这个问题的好办法
test <- function() {
 "hello world"
  a <- "hello world"
}