2016-03-10 114 views
1

我想用函數返回的項填充矢量。但我不能夠執行fn (c(1,3,4,7,8,9))用於填充矢量的R函數

後,要做到這一點

w=NULL 
fn=function(x){ 

for (i in x){ if (i%%2==1){ w <- c(w, i) 
} print (w) 

} return (w) } 

我仍然得到

w NULL 

我所期待的是

w [1] 1 3 7 9 
+0

的功能產生錯誤 – SymbolixAU

+2

你不需要所有的循環等 - 'test < - c(1,3,4,7,8,9); fn < - function(x)x [x %% 2 == 1]; fn(test)' – thelatemail

回答

1

此作品爲R代碼,但這是你期望的嗎?

w <- NULL 

fn <- function(x){ 

    for(i in x){ 

     if(i%%2==1){ 
      w <- c(w, i) 
     } 
     print (w) 
    } 
return (w) 
} 

x <- c(1,3,4,7,8,9) 
fn(x) 
# [1] 1 
# [1] 1 3 
# [1] 1 3 
# [1] 1 3 7 
# [1] 1 3 7 
# [1] 1 3 7 9 
# [1] 1 3 7 9 

你其實只是想

x[x%%2==1] 
# [1] 1 3 7 9 
1

通常要使用w你的功能比你在R對話使用的一個(不同儘管兩者被稱爲相同)。這就是爲什麼你的函數在執行後不會改變你的R會話中的w,並且它保持爲NULL。

如果你真的想改變在函數中R對話的w的價值,你可以使用賦值<<-

w = NULL 
fn = function (x) { 
    for (i in x) { 
     if (i %% 2 == 1) { 
      w <<- c (w, i) ## here is the change 
     } 
     print (w) 
    } 
    return (w) # and this is not strictly needed 
} 

fn (c(1,3,4,7,8,9)) 

w 

[1] 1個3 7 9

+0

我不認爲你的理由是**爲什麼**'w'沒有改變。詞法範圍的確定意味着'w'會因爲在封閉環境中而發生變化 – SymbolixAU