R 如何在不循环的情况下将eval函数应用于向量?

R 如何在不循环的情况下将eval函数应用于向量?,r,vector,expression,eval,R,Vector,Expression,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

我有个问题。我尝试将
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。只需
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
库(data.table)
P 0.2
事件=c(0.1,0.7,0.2)
比较=c(“”)
{
P[,paste0(“VecEv”,i):=P1>get(paste0(“事件”,i))]
}否则
{
P[,paste0(“VecEv”,i):=P1
我理解,但问题是我必须对不同的事件进行循环,这就是我使用的原因。我做了一些更改,你能看一下吗?谢谢!看起来很棒!如果您认为这是正确答案,请在答案上打勾。谢谢。我给你+1。我认为您不需要
if()
。尝试键入
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