gpt4 book ai didi

R 不召回内存中的对象

转载 作者:行者123 更新时间:2023-12-04 10:59:08 25 4
gpt4 key购买 nike

我正在构建一个包含多个步骤的函数,其中每个步骤都会创建一个对象。某个步骤失败(temp3)并且找不到之前的步骤对象(错误:找不到对象'temp2')。我不确定为什么 - 我有类似的函数,它们遵循完全相同的结构,每个步骤都遵循先前创建的对象,在函数内运行良好。当您在函数之外运行该代码时它可以工作(因此代码看起来很好),并且使用 debug() 应该不创建数据的步骤(temp2)实际上存储在本地内存中(所以我可以看到对象“temp2”),但由于某种原因,R 似乎无法识别或使用它。我难住了!也许我只是不明白 R 如何评估步骤和召回本地内存中的对象?我是否以错误的方式编写函数?

我可以很容易地准备一个有效的例子,如果它有更多的用处,因为这个函数会调用奇怪的包等,但目前我认为它更多的是我如何误解 R 如何将对象分配给函数内的本地内存的问题.这里有一个类似的查询,How does R handle object in function call? ,但实际上我在函数中分配每个新对象。你能帮忙吗?

    glm.random<-function(df){
reps=5
output<-matrix(NA, ncol=1, nrow=0)
while (length(output[,1])<reps) {
temp1 <- ddply(df,.(study_id),randomRows,1)
temp2 <- subset(temp1,select = c(continent,taxatype, metric,nullm, yi_pos))
temp3 <- glmulti(yi_pos ~ ., data = temp2, family = gaussian( link = log), crit = aic, plotty = F, report = F)
temp4 <- noquote(paste(summary(temp3)$bestmodel[1]))
output<-rbind(output,temp4)
}
write.table(output, "output.glm.random1.txt", append=TRUE, sep="\t", quote=FALSE)
}

在回复中:

你好,

安德烈 – 1).所以我删除了 subset 的使用(但这里很好奇,你指的是什么“意外结果”?)。 2).我发现手头的数据很难处理,但我明白你的意思,需要改进我的编码方法 3)。好提示!但这里只是为了检查它是否正常工作——我可能只是使用该输出对象进行更多分析。

Gavin 1) 会的! 2+3) 所以错误似乎在于创建(或召回)“temp1”。

我希望下面是一些可重现的代码。如果有帮助,我尝试复制的方法可以在 Gibson 等人中找到。 2011 自然 478:378。 (参见详细方法“广义线性模型”。)。

Thank you!

#rm(list = ls())
library("plyr")
library("glmulti")
# random rows function
randomRows = function(df,n){
return(df[sample(nrow(df),n),])
}
# Dataframe example
study_id <- c(1,1,1,1,2,2,3,3,3,4)
continent <- c("AF","AF","AF","AF","AF","AF", "AS", "AS", "AS", "SA")
taxatype <- c("bird","bird","bird","mam","mam","arthro", "arthro", "arthro", "arthro", "arthro")
metric<- c("sppr","sppr","sppr","sppr","abund","abund", "abund", "abund", "abund", "abund")
extra.data<- c(34:43)
yi_pos<- runif(1:10)
df<- data.frame(study_id=study_id, continent=continent,metric=metric, taxatype=taxatype,extra.data = extra.data, yi_pos = yi_pos)
df

# Function. Goal:repeat x10000 (but here reps =5) ( Select one random value per study_id, run glmulti{glmulti}, select best ranked model, concatenate to an output and export).
glm.random<-function(df){
reps=5
output<-matrix(NA, ncol=1, nrow=0)
while (length(output[,1])<reps) {

temp1 <- ddply(df,.(study_id),randomRows,1)
temp3 <- glmulti(yi_pos ~ continent+taxatype+metric, data = temp1, family = gaussian( link = log), crit = aic, plotty = F, report = F)
temp4 <- noquote(paste(summary(temp3)$bestmodel[1]))
output<-rbind(output,temp4)
}
write.table(output, "output.glm.random1.txt", append=TRUE, sep="\t", quote=FALSE)
}

# run function to obtain error
glm.random(df)

# debug(glm.random)
# glm.random(df)
# undebug(glm.random)

最佳答案

来自 ?glmulti,

If [the argument data is] not specified, glmulti will try to find the data in the environment of the formula, from the fitted model passed as y argument, or from the global environment.

但是,当您指定 data = temp1 时,glmulti 显然会在全局环境中查找此对象。因此,您可能需要将随机选择的数据分配给全局环境(我稍微重命名了一些内容以尝试检查名称和对象):

glm.random2<-function(df){
reps=5
output<-matrix(NA, ncol=1, nrow=0)
while (length(output[,1])<reps) {
## Here things are different
temp2 <- ddply(df,.(study_id),randomRows,1)
names(temp2)[2]<-"cOntinent"
assign("temp1",temp2,envir=.GlobalEnv)
## Note the slightly modified formula, to check whether
## gmulti looks for terms in temp1 or simply as named objects in the environment
## It looks like the former, which is good.
temp3 <- glmulti(yi_pos ~ cOntinent+taxatype+metric, data = temp1,
family = gaussian( link = log), crit = aic, plotty = F, report = F)
temp4 <- noquote(paste(summary(temp3)$bestmodel[1]))
output<-rbind(output,temp4)
## Remove the object temp1 from the global environment
rm(temp1,envir=.GlobalEnv)
}
write.table(output, "output.glm.random1.txt", append=TRUE, sep="\t", quote=FALSE)
}

# run function - no error for me!
glm.random2(df)

您可能需要与包维护者核实,看看这是否是 glmulti 工作的预期方式。

关于R 不召回内存中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329984/

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