gpt4 book ai didi

r 将值传递给内部函数找不到

转载 作者:行者123 更新时间:2023-12-03 23:05:23 25 4
gpt4 key购买 nike

我还是 R 的新手..并且已经阅读过以前的类似帖子...我认为这与 r 传递 promise 但不传递值这一事实有关,但我不是很清楚哪里错了这里..

这是我想尝试的代码的简单版本:

定义:

data<-data.frame(TYPE=as.integer(runif(20,1,3)),COL1=runif(20,1,100),COL2=runif(20,1,10))
RULEA=10
RULEB=20

我的运行如下:

f<-function(data,metric="A"){
data<-ddply(data,.(TYPE),transform,SUMCOL1=sum(COL1,na.rm=TRUE),SUMCOL2=sum(COL2,na.rm=TRUE))
data1<-f1(data=data,metric=metric)
return(data1)
}

f1<-function(data=data,metric="A"){
if(metric=="A"){
RULE<-RULEA
data$FACTOR<-data$COL1
}else if(metric=="B"){
RULE<-RULEB
data$FACTOR<-data$COL1
}
if(nrow(data!=0)){
x<-subset(data,FACTOR>1)
if(nrow(x)!=0){
x<-ddply(x,.(TYPE),mutate,sig=(max(FACTOR)>2*min(FACTOR)) & min(FACTOR) < RULE)
}
}

return(x)
}

如果我按如下方式运行: f(data,metric="A")

它会给我结果:

> f(data,metric="A")
Error in eval(expr, envir, enclos) : object 'RULE' not found

我不确定为什么找不到“RULE”......?感谢您的帮助!

最佳答案

这是一种使用 data.table 的方法,它可能很有用,因为它避免了这个问题。

请注意,我在每个函数中明确复制了 data.tables,以使函数的行为更像常规 R 函数——因此我并没有真正利用 data.table 内存效率,而是它评估的方式 j 很好(而且它会比 ddply 更快)。

一般来说,会有更多 data.tableish 方式来做你想做的事,这个答案并不是真的想那样做。

f<-function(DT,metric="A"){
## explicit copy to avoid assignment in global `DT`
dd <- copy(DT)
## add sum columns to local copy
dd[, c('SUMCOL1', 'SUMCOL2') := lapply(.SD, sum ,na.rm = TRUE),by = 'TYPE', .SDcols = c('COL1','COL2')]
# do f1 on dd
dd1<-f1(DT = dd,metric=metric)
# return results
return(dd1)
}


f1<-function(DT,metric="A"){
## explicit copy
ddd <- copy(DT)
# assign RULE (a bit simpler)
RULE <- switch(metric, 'A' = RULEA, 'B' = RULEB)
# i FACTOR didn't depend on metric
ddd[, FACTOR := COL1]
# subset
x <- ddd[FACTOR >1, ]

x[, sig :=(max(FACTOR)>2*min(FACTOR)) & min(FACTOR) < RULE ,by = 'TYPE']
return(x)
}

f(data.table(data),metric="A")

关于r 将值传递给内部函数找不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com