2013-09-27 39 views
0

我遇到问题。我尝试将eval函数应用于矢量。但返回的结果不是一个向量,而只是一个值。我解释:如何将eval函数应用于没有循环的矢量?

Event <- c("< 0.5") 
P  <- round(runif(1:10), 4) 
Vec_Ev<- parse(text=paste(P, Event)) 

Vec_EV 
expression(0.2086 < 0.5, 0.0937 < 0.5, 0.7238 < 0.5, 0.5806 < 0.5, 
0.7616 < 0.5, 0.6743 < 0.5, 0.9124 < 0.5, 0.393 < 0.5, 0.7401 < 0.5, 
0.5601 < 0.5) 

现在我想要得到这些不平等的结果。但结果是:

eval(Vec_Ev) 
[1] FALSE 

而不是一个向量。

是否有可能获得没有循环的矢量结果?

回答

2

你不需要在这里使用eval。只需P > 0.5将工作。

P 
    #[1] 0.3812 0.1939 0.4249 0.1729 0.4161 0.5480 0.9688 0.5409 0.7861 0.1967 
    P > 0.5 
    #[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE 

一般来说,建议您避免使用eval。如果你真的必须使用get,mget,assign。

编辑,对于多个事件我会建议一种方法如下。这是一个快速解决方案,但我认为可能有一个更优雅的方式来做到这一点。如果我找到更好的东西,我会更新。

library(data.table) 

P <- data.table(P1 = round(runif(1:10), 4)) 

# first check is for < 0.1, second is for < 0.7, third is for > 0.2 
Events = c(0.1,0.7,0.2) 
Compare = c('<','<','>') 

for (i in 1:length(Events)) 
{ 
P[, paste0("Event",i) := Events[i]] 
if (Compare[i] == '>') 
{ 
    P[, paste0("VecEv",i):= P1 > get(paste0('Event',i))] 
} else 
{ 
    P[, paste0("VecEv",i):= P1 < get(paste0('Event',i))] 
} 
} 

# P 
     # P1 Event1 VecEv1 Event2 VecEv2 Event3 VecEv3 
# 1: 0.5328 0.1 TRUE 0.7 FALSE 0.2 FALSE 
# 2: 0.3306 0.1 TRUE 0.7 FALSE 0.2 FALSE 
# 3: 0.3132 0.1 TRUE 0.7 FALSE 0.2 FALSE 
# 4: 0.1355 0.1 TRUE 0.7 FALSE 0.2 TRUE 
# 5: 0.6571 0.1 TRUE 0.7 FALSE 0.2 FALSE 
# 6: 0.7568 0.1 TRUE 0.7 TRUE 0.2 FALSE 
# 7: 0.9472 0.1 TRUE 0.7 TRUE 0.2 FALSE 
# 8: 0.2839 0.1 TRUE 0.7 FALSE 0.2 FALSE 
# 9: 0.7823 0.1 TRUE 0.7 TRUE 0.2 FALSE 
# 10: 0.1164 0.1 TRUE 0.7 FALSE 0.2 TRUE 
+0

我理解,但问题是,我必须做不同的事件循环,这就是为什么我用 – sandikou

+0

膏(P,事件) – sandikou

+0

有人能帮忙吗? – sandikou