R 中较大函数中的函数之间的对象(可重现代码)



这很简单,但它让我对我的生活感到困惑。

我正在尝试将在较大函数中创建的对象(数值变量、数据框等(放入该较大函数中的较小函数中

下面的示例函数的输出应该是一个包含 20 行的 data.frame,但我只得到"test"。有人可以解释一下 R 中的这个对象函数行为以及如何在函数之间获取创建的对象吗?提前感谢!

testfunload <- function(test){
###All my different tries to get test dataframe into testfunload function
  txt <- get("test")
  try1 <- get(test)
  try2 <- get(paste0(txt))
  try3 <- get(paste0(test))
  try4 <- get(test)
  try5 <- test
  try6 <- get("test")
  print(try1)
  print(try2)
  print(try3)
  print(try4)
  print(try5)
  print(try6)
}
###Testing with test data.frame in local environment
testfunload2 <- function(){
test <- data.frame(i1=rep("i",20), i2=rep("I",20))
testfunload(test="test")
}
###Testing with test data.frame in local environment
testfunload2global <- function(){
  test <<- data.frame(i1=rep("i",20), i2=rep("I",20))
  testfunload(test="test")
}
###PROBLEM:Doesn't have data.frame only "test" as char
testfunload2()
[1] "test"
[1] "test"
[1] "test"
[1] "test"
[1] "test"
[1] "test"
###PROBLEM:Doesn't have data.frame only "test" as char
testfunload2global()
[1] "test"
[1] "test"
[1] "test"
[1] "test"
[1] "test"
[1] "test"

期望输出:

   i1 i2
1   i  I
2   i  I
3   i  I
4   i  I
5   i  I
6   i  I
###on for 20 rows etc. 

对我来说,这看起来有点像将变量传递给函数的复杂方法。也许您可以使用...参数得到您想要的?

但是,如果要访问调用范围,可以查看parent.frame()。它为您提供了调用函数的作用域中的环境。

考虑以下函数:

f <- function() {
    e <- parent.frame()
    with(e, x + y)
}

它评估调用作用域中的x + y - 在某种程度上,您获得的是动态范围而不是词法范围。

因此,使用这些函数,您将xy传递给f,而无需显式执行此操作。

g <- function(x, y) f()
h <- function(x) { 
    y <- 2
    f()
}

他们将像这样工作:

> g(1, 1)
[1] 2
> h(3)
[1] 5

当然,仅仅制作xy参数f会简单得多

相关内容

  • 没有找到相关文章

最新更新