2016-10-29 40 views
2

的功能將類似於:在R中,是否可以在函數內創建一個新對象並將其傳遞給父環境?

function(input, FUN, output) { 

    output <- FUN(input) 

    return(input) 

} 

輸出在哪裏是要創建一個對象的不帶引號的名稱。

讓我們跳過這可能是一個壞主意的部分:這種事情可能嗎?你會怎麼做呢?

+0

返回的對象將有你把它分配給了名字。它在函數中的名字是無關緊要的。 –

+0

如果您需要可保留狀態的對象,請考慮使用參考類或R6類。 –

回答

7

Clean代碼只會返回它。

但你還有其他選擇:

  • <<-操作
  • assign()功能,你可以列出的環境中分配給

下面是一個簡單的例子:

R> foo <- function(x=21) { y <<- 2*x; return(3*x) } 
R> foo(10) 
[1] 30 
R> y 
[1] 20 
R> 
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 
相關問題