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