我想知道为什么ifelse(1<2,print("true"),print("false"))
会返回
[1] "true"
[1] "true"
而ifelse(1<2,"true","false")
返回
[1] "true"
我不明白为什么print
ifelse
内"true"
两次返回height:auto
答案 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
else
。 The 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评论基本相关。