在R中,是否可以在函数内创建一个新对象并将其传递给父环境?

时间:2016-10-29 15:15:02

标签: r

该功能看起来像:

&

其中output是要创建的对象的不带引号的名称。

让我们跳过这可能是一个坏主意的部分:这种事情有可能吗?你会怎么做呢?

2 个答案:

答案 0 :(得分:7)

Clean 代码只会返回它。

但你有其他选择:

  • <<-运算符
  • assign()函数,您可以在其中列出要分配给
  • 的环境

这是一个简单的例子:

R> foo <- function(x=21) { y <<- 2*x; return(3*x) }
R> foo(10)
[1] 30
R> y
[1] 20
R> 

答案 1 :(得分:4)

1)试试这个:

fun <- function(input, FUN, output = "output", envir = parent.frame()) {
    envir[[output]] <- FUN(input)
    input
}

fun(4, sqrt)
## [1] 4
output
## [1] 2

请注意,如果将输出变量名称硬编码为output,则可以写入分配:

envir$output <- FUN(input)

2)如果您想输出输入和输出但又避免副作用的另一种可能性是在列表中返回两者:

fun2 <- function(input, FUN, output = "output") 
  setNames(list(input, FUN(input)), c("input", output))

fun2(4, sqrt)

,并提供:

$input
[1] 4

$output
[1] 2

2a)其中一个变体是:

devtools::install_github("ggrothendieck/gsubfn") 
library(gsubfn)  # list[...] <- ...
list[input, output] <- fun2(sqrt)

,并提供:

> input
[1] 4
> output
[1] 2

3)另一种可能性是在属性中传递输入:

fun3 <- function(input, FUN) {
  out <- FUN(input)
  attr(out, "input") <- input
  out
}

fun3(4, sqrt)

,并提供:

[1] 2
attr(,"input")
[1] 4