R 在函数的lappy中调用update,为什么不';它不起作用吗?

R 在函数的lappy中调用update,为什么不';它不起作用吗?,r,lapply,lm,R,Lapply,Lm,这是一个后续问题,但可能不是同一个问题(但仍然相关) 以下是一个可复制的示例: dd <- data.frame(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = rnorm(100), x4 = rnorm(100), wg = runif(100,1,100)

这是一个后续问题,但可能不是同一个问题(但仍然相关)

以下是一个可复制的示例:

dd <- data.frame(y = rnorm(100),
                 x1 = rnorm(100),
                 x2 = rnorm(100),
                 x3 = rnorm(100),
                 x4 = rnorm(100),
                 wg = runif(100,1,100))

ls.form <- list(
  formula(y~x1+x2),
  formula(y~x3+x4),
  formula(y~x1|x2|x3),
  formula(y~x1+x2+x3+x4)
)
如果调用该函数,则会出现错误:

f1(1:66, dat = dd, forms = ls.form, wgt = "wg")
 Error in is.data.frame(data) : object 'dat' not found 
我真的不明白为什么它找不到
dat
对象,它应该是Function环境的一部分。问题出在代码的
更新
部分,如果从函数中删除这一行,代码就会正常工作

最后,将使用
lappy

lapply(list(1:66, 33:99), f1, dat=dd, forms = ls.form, wgt="wg")

此类范围问题在
lm
对象中非常常见。您可以通过指定正确的评估环境来解决此问题:

f1 <- function(samp, dat, forms, wgt){
  baselm <- lm(y~x1, data = dat[samp,], weights = dat[samp,wgt])
  mods <- lapply(forms, update, object = baselm, evaluate = FALSE)
  e <- environment()
  lapply(mods, eval, envir = e)
}

f1(1:66, dat = dd, forms = ls.form, wgt = "wg")
#works

f1此类范围界定问题在
lm
对象中非常常见。您可以通过指定正确的评估环境来解决此问题:

f1 <- function(samp, dat, forms, wgt){
  baselm <- lm(y~x1, data = dat[samp,], weights = dat[samp,wgt])
  mods <- lapply(forms, update, object = baselm, evaluate = FALSE)
  e <- environment()
  lapply(mods, eval, envir = e)
}

f1(1:66, dat = dd, forms = ls.form, wgt = "wg")
#works

f1我认为你的问题是由于
lm
使用的范围规则造成的,坦率地说,这是r平方中的一个难题

一个选项是使用
do.call
使其工作,但当它对输入进行分解以给出用于标准打印方法的调用时,会得到一些不好的输出

f1 <- function(samp, dat, forms, wgt){
  baselm <- do.call(lm,list(formula=y~x1, data = dat[samp,], weights = dat[samp,wgt]))
  lapply(forms, update, object = baselm)
}

我认为您的问题是由于
lm
使用的范围规则造成的,坦率地说,这是r平方中的一个难题

一个选项是使用
do.call
使其工作,但当它对输入进行分解以给出用于标准打印方法的调用时,会得到一些不好的输出

f1 <- function(samp, dat, forms, wgt){
  baselm <- do.call(lm,list(formula=y~x1, data = dat[samp,], weights = dat[samp,wgt]))
  lapply(forms, update, object = baselm)
}

接受的错误是有效的,但我继续挖掘,发现了这个旧的r-help问题(),它提供了更多的选项和解释。我想我会把它贴在这里,以防其他人需要它。

接受的错误工作,但我继续挖掘,发现了这个旧的r-help问题(),它提供了更多的选项和解释。我想我会在这里发布它,以防其他人需要它。

您的示例每次都有效,但当我将其应用于实际问题时,我仍然没有找到
对象'dd.temp.ref'
,我通过在主环境中加载不同的参数来使其工作,但一旦重新启动R,它就不再工作了。。。如果我找到了复制它的方法,我会继续挖掘并返回。我不知道是什么错了,但我的调用是不一样的。您正在以编程方式将公式传递给lm,这很可能会产生额外的作用域问题。您应该在语言上进行计算,将公式插入lm表达式,然后在函数环境中计算该表达式。我有一个答案,说明如何做到这一点,但搜索它已经很困难,当我不必做我的手机。你是对的,问题是我提取的公式列表中。。。考虑到
相同(公式(y~x1+x2),ls.form[[1]])
真的
。。。今天有这么多奇怪的虫子@James solution的工作,因此没有匆忙,但是我对您正在讨论的解决方案感兴趣。感谢您在有机会的时候发布它。您的示例每次都有效,但当我将其应用于实际问题时,我仍然没有找到
对象'dd.temp.ref'
,我通过在主环境中加载不同的参数使其工作,但一旦我重新启动R,它就不再工作了。。。如果我找到了复制它的方法,我会继续挖掘并返回。我不知道是什么错了,但我的调用是不一样的。您正在以编程方式将公式传递给lm,这很可能会产生额外的作用域问题。您应该在语言上进行计算,将公式插入lm表达式,然后在函数环境中计算该表达式。我有一个答案,说明如何做到这一点,但搜索它已经很困难,当我不必做我的手机。你是对的,问题是我提取的公式列表中。。。考虑到
相同(公式(y~x1+x2),ls.form[[1]])
真的
。。。今天有这么多奇怪的虫子@James solution的工作,因此没有匆忙,但是我对您正在讨论的解决方案感兴趣。谢谢你在有机会的时候发布。你的两个选项都适用于我的主代码,谢谢!我感觉它比我的原始代码慢(没有weigth参数),但没有对它进行基准测试,因为它仍然是真正可用的。
do.call
是最快的。无论如何,对于一个非常模糊的bug来说,这是一个非常模糊的修复。。。今天我的两个bug都很奇怪,需要我进一步研究,才能真正了解到底发生了什么!R地狱第8圈中的第8.1.70节涉及到这些问题:您的两个选项都适用于我的主代码,谢谢!我感觉它比我的原始代码慢(没有weigth参数),但没有对它进行基准测试,因为它仍然是真正可用的。
do.call
是最快的。无论如何,对于一个非常模糊的bug来说,这是一个非常模糊的修复。。。今天我的两个bug都很奇怪,需要我进一步研究,才能真正了解到底发生了什么!R地狱第8圈中的第8.1.70节涉及这些问题: