2014-10-05 179 views
-2

我明白爲什麼rep功能沒有通過反覆試驗解決,並且爲了使random.sum(5)工作,rep(100, 10)必須是rep(100, 5)。但我不明白爲什麼:R功能中的代表功能

# clear the workspace 
rm(list=ls()) 

random.sum <- function(n) { 
    x[1:n] <- ceiling(10*runif(n)) 
    cat("x:", x[1:n] ,"\n") 
    return(sum(x)) 
} 

set.seed(3585) 

x <- rep(100,10) 

show(random.sum(10)) 
x: 9 4 10 1 9 8 4 1 3 2 
## [1] 51 

show(random.sum(5)) 
x: 9 6 6 2 2 
## [1] 525 
+1

你究竟想要完成什麼?實際上,避免副作用是明智的(即試圖在'random.sum'函數之外修改'x')。您不需要在全局環境中聲明'x'以在'random.sum'中使用它。 – hrbrmstr 2014-10-05 01:26:29

+0

這是我在作業中給出的一個問題,以查明該函數有什麼問題。我可以看到函數中出了什麼問題,但無法確定哪裏出了問題,所以我嘗試了一個錯誤,發現它是造成它的代表(100,10)。 – 2014-10-05 01:56:32

回答

2

那是因爲你沒有建立在你的函數的新變量x,但服用x的副本在封閉的環境中,並修改。因此sum(x)添加了10個元素,其中最後五個元素的值爲100

要解決,不分配到的x片的ceiling結果分配給一個變量,任何名稱的,甚至x

random.sum <- function(n) { 
    x <- ceiling(10*runif(n)) 
    cat("x:", x[1:n] ,"\n") 
    return(sum(x)) 
} 

set.seed(3585) 
random.sum(10) 
## x: 9 4 10 1 9 8 4 1 3 2 
## [1] 51 

random.sum(5) 
## x: 9 6 6 2 2 
## [1] 25 

注差爲500,最終元素全球x