2016-09-14 37 views
1

我做了簡易R腳本並運行:爲什麼在函數調用之後R重置dataframe列?

f <- data.frame(x = c(1,1)) 
f$y <- NA 

test <- function(n) { 
    f$y[1] <- 1 
    print(f) 
} 

test(0) 
print(f) 

結果是

> test(0) 
    x y 
1 1 1 
2 1 NA 
> print(f) 
    x y 
1 1 NA 
2 1 NA 
> 

我希望在最終輸出(1,1)(1,NA),但由於某種原因,F $ y [1]已被重置爲NA。

當我內聯函數時,結果是確定的。

爲什麼函數調用對dataframe列有這個副作用? 它可以避免嗎?

+4

在函數式編程,功能應該不會有*副作用*。這意味着如果一個函數改變了一個數據框,那麼這個改變只是該函數的局部。如果你希望這個改變在函數外部可用,那麼這個函數應該'返回()'數據框,你應該分配結果。 – Gregor

+0

你的問題似乎並不是*「函數調用有這個數據幀列的副作用」*,而是你的數據框在運行該函數後沒有改變 - 它對你的數據框沒有任何影響(在它之外內部副本)。 – Gregor

+0

所以我需要在我的代碼中寫f < - test(f)以保持更改。或者更好地重寫它,並返回另一個只有y列的'結果'數據框。對? – Ben

回答

1

如何:

f <- data.frame(x = c(1,1)) 

f$y <- NA 

test <- function(f) { 
    f$y[1] <- 1 
    return(f) 
} 

f <- test(f) 
print(f) 
x y 
1 1 1 
2 1 NA 
相關問題