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

时间:2018-03-19 19:32:14

标签: r function global-variables

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

我正在尝试将较大函数中创建的对象(数字变量,数据框等)转换为较大函数中的较小函数。

下面的示例函数的输出应该是一个包含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. 

1 个答案:

答案 0 :(得分:0)

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

但是,如果要访问调用范围,可以查看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参数, 就更简单了。