`ifelse`中的`print`函数

时间:2015-07-25 20:10:12

标签: r if-statement

我想知道为什么ifelse(1<2,print("true"),print("false"))会返回

[1] "true"
[1] "true"

ifelse(1<2,"true","false")返回

[1] "true"

我不明白为什么print ifelse"true"两次返回height:auto

3 个答案:

答案 0 :(得分:13)

这是因为ifelse将始终返回一个值。运行ifelse(1<2,print("true"),print("false"))时,会选择yes条件。这个条件是在控制台上打印"true"的函数调用,所以它确实如此。

print()函数也会返回其参数,但不可见(例如,分配),否则在某些情况下您会打印两次值。当评估yes表达式时,其结果是ifelse返回的结果,并且ifelse不会无形地返回,因此,它会打印结果,因为它是在全局环境中运行的,没有任何作业。

我们可以测试一些变化并检查发生了什么。

> result <- print("true")
[1] "true" # Prints because the print() function was called.
> result
[1] "true" # The print function return its argument, which was assigned to the variable.

> ifelse(1<2, {print("true");"TRUE"},print("false"))
[1] "true" #This was printed because print() was called
[1] "TRUE" #This was printed because it was the value returned from the yes argument

如果我们分配此ifelse()

> result <- ifelse(1<2, {print("true");"TRUE"},print("false"))
[1] "true"
> result
[1] "TRUE"

我们还可以看一下评估两种条件条件的情况:

> ifelse(c(1,3)<2, {print("true");"TRUE"},{print("false");"FALSE"})
[1] "true" # The yes argument prints this
[1] "false" # The no argument prints this
[1] "TRUE"  "FALSE" # This is the returned output from ifelse()

您应该使用ifelse创建新对象,而不是根据条件执行操作。为此,请使用if elseThe R Inferno对于两者之间的差异有很好的部分(3.2)。

答案 1 :(得分:1)

只是为Molx的优秀答案添加一些论据。 发生这种情况的原因之一依赖于此:

length(print("true"))
[1] "true"
[1] 1
length(length(print("true")))
[1] "true"
[1] 1
length(length(length(print("true"))))
[1] "true"
[1] 1

......等等......

在R手册中声明:

  

是返回测试的真实元素的值

注意,而不是,这里我们有两个值:一个是print函数的对象(必须打印“true”,很可能它是对函数的调用,在这种情况下是print,其结果是带有true的字符向量,另一个是输出打印“true”,它是{的正确元素{1}}陈述。

可以通过以下方式避免:

ifelse

答案 2 :(得分:-1)

是否打印为TRUE并同时返回TRUE?

因此,例如使用cat代替print会改变输出......

这与ulfelders评论基本相关。