qoiqpwqr 发表于 2013-1-20 01:01
那个两次输出的问题:一个是print输出的,一个是ifelse输出的。
谢谢
qoiqpwqr兄的提示
借 yearslaked 楼主这个问题,顺便把ifelse的之前有个问题,解决掉了。:D
https://bbs.pinggu.org/thread-2175220-1-1.html
> ifelse
function (test, yes, no)
{
storage.mode(test) <- "logical"
ans <- test
nas <- is.na(test)
if (any(test[!nas]))
ans[test & !nas] <- rep(yes, length.out = length(ans))[test &
!nas]
if (any(!test[!nas]))
ans[!test & !nas] <- rep(no, length.out = length(ans))[!test &
!nas]
ans[nas] <- NA
ans
}
<bytecode: 0x0deed130>
<environment: namespace:base>
ifelse 中的核心原来是 由rep语句组成的的向量:ans。 ans的初始值为 test的逻辑值,长度为test的长度。再通过if语句,及向量化[..==..]把 rep的值赋予ans.
rep(print("2"),2)
[1] "2"
[1] "2" "2"
print语句优先, 后rep。说明了为什么两次的原因。
rep(cat("2","\n"),2)
> rep(cat("2","\n"),2)
2
NULL
ps:cat() 属于什么类型的数据结构,还是很疑惑。 mode...等等 都不行 cat值也不能赋予给别的对象。
@
kaifengedu
还是借着个贴,一起讨论你那个具体的 ifelse撒。
ifelse(Owls$FoodTreatment == "Satiated", Owls$NestNight <- paste(Owls$Nest, "1",sep = "_"),
Owls$NestNight <- paste(Owls$Nest, "2",sep = "_"))
中有一个有问题的赋值问题
ifelse的返回值会只认function(test,yes, no)中:yes,no部分, 不干预赋值的表达。而Owls$NestNight 进行了两次赋值,只会认后一次的赋值Owls$NestNight <- paste(Owls$Nest, "2",sep = "_"),为最终赋值。 及,为什么都是"_2" , 但是ifelse返回的值,是正确的,是你想要的。(根据 kaifengedu 一起讨论,赋值得部分,是根据是否运行,no 来决定是否 实现第二次赋值)
简单点:就是为什么会:
> x = c(1,1,2,3)
> ifelse(x==1,y <- 1, y <- 0)
[1] 1 1 0 0
> y
[1] 0
如果 <- 改为=号。
这里边其实还是有个很重要的、需要很小心的地方,万分小心 也不为过!!!
(看来<- = 区别还是有的, 赋值及 =在函数中 有表示参数的作用)
1、ifelse代码:
>ifelse
function(test,yes,no)...
所以:
x = c(1,1,2,3)
ifelse(x==1,
y = 1, 0) #相当与 ifelse(x==1,
yes = 1, no=0)
[1] 1 1 0 0
>y
Error: object 'y' not found #y根本就没有建立,ifelse()中的y只是参数 yes=的缩写字母。
2、ifelse 中使用=, 代表参数,非赋值
ifelse(x==1, you=1,0)是错误的,没有you这个参数。
其中特别小心的地方是:顺序,默认yes在前, no在后, 但如果指明yes 和no 的话,写前,写后都可以
x = c(1,1,2,3)
ifelse(x==1,
n= 1, 0)
[1] 0 0 1 1 #不是 [1] 1 1 0 0 haha,n= 为参数no=
同时:
ifelse(x==1,y=1,y=0),对不起, 参数
y(yes)是重复的。
qoiqpwqr兄 如有问题与补充 请提出指正,thx