这很简单,但它让我对我的生活感到困惑。
我正在尝试将在较大函数中创建的对象(数值变量、数据框等(放入该较大函数中的较小函数中。
下面的示例函数的输出应该是一个包含 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
- 在某种程度上,您获得的是动态范围而不是词法范围。
因此,使用这些函数,您将x
和y
传递给f
,而无需显式执行此操作。
g <- function(x, y) f()
h <- function(x) {
y <- 2
f()
}
他们将像这样工作:
> g(1, 1)
[1] 2
> h(3)
[1] 5
当然,仅仅制作x
和y
参数f
会简单得多。