2016-09-30 47 views
0

我創建了以下函數來在名爲「飯食」的字符串矢量上附加新字符串。但是,當我使用此函數將字符串輸入附加到我的「膳食」向量時,它不起作用。這個R函數爲什麼不起作用?

add <- function(str) { 
     meals <- append(meals, as.character(str)) 
    } 
+1

這兩個評論都錯過了這一點。該功能將起作用,但需要以功能性方式應用,即:'飯食< - 添加(c(「午餐」,「晚餐」))' –

+2

因爲它會返回'append'調用的值。嘗試它並閱讀'?'< - '' –

+0

我把這個問題擱置的問題。這不是一個錯字。至少有兩位評論者(現在已經刪除了他們的評論)展示了R功能如何返回值,並且還由於也錯過了這個方面的兩個答案展示了這一點。它可以作爲一個有用的例子,但現在封閉似乎正在把它掃到地毯下。僅僅因爲提問者不理解這一點並不是一個微不足道的問題。這實際上是一個相當深刻的問題,它的正確答案表明了R和大多數其他計算機語言之間的根本區別。 –

回答

0

你需要確保你分配功能輸出到你的情況的變量嘗試一些像這樣的(3個可能的解決方案):

## longest/redundant 
add <- function(str) { 
    meals <- append(meals, as.character(str)) 
    return(meals) 
} 

## alternative 
add2 <- function(str) { 
    meals <- append(meals, as.character(str)) 
} 

## simplest 
add3 <- function(str) { 
    append(meals, as.character(str)) 
} 

meals <- c("chx","beef","pork") 
str1 <- c(1, 2, 3) 

newVar <- add(str1) 
print(newVar) 
[1] "chx" "beef" "pork" "1" "2" "3" 

newVar2 <- add2(str1) 
print(newVar2) 
[1] "chx" "beef" "pork" "1" "2" "3" 

newVar3 <- add3(str1) 
print(newVar3) 
[1] "chx" "beef" "pork" "1" "2" "3" 

你也可以考慮一個簡單的解決方案:

c(meals, str1)這將返回相同的確切的東西。通常僅在需要使用after參數時才使用append

+0

在這種情況下使用return是不必要的。這個答案會打印該值,但會讓用戶改變str。覈實。它保持不變。 –

+0

良好的通話,更新它。 – TBSRounder

+0

[有趣的討論是否完全使用返回()或不](http://stackoverflow.com/questions/11738823/explicitly-calling-return-in-a-function-or-not) – TBSRounder

0

它不起作用?

有一點需要考慮:函數的輸出是函數的最後一行。例如:

x.plus.3 <- function(x){ 
     s <- x+3 
} 
x.plus.3(2) 
# nothing is printed 

這是一個有效的函數,但如果運行將沒有輸出,因爲所有函數都將x + 3存儲到對象s中。

但是,如果我將其更改爲:

x.plus.3 <- function(x){ 
     s <- x+3 
     s 
} 
x.plus.3(2) 
[1] 5 # i get the result printed 

所以,你需要爲了得到它,使之功能外增加餐點的最後一行在你的函數。

0

這裏的問題是變量作用域。變量meals存在於您正在使用它的全局環境中。當你運行你的函數時,函數環境中沒有meals變量,所以它從全局環境繼承該變量。但是,當它修改變量時,它會在函數環境內創建新版本。該函數然後可以使用該修改後的版本,但不會從全局環境中更改meals變量。

所以,你可以使用此功能,因爲它是目前寫的,只是結果保存到meals像這樣:

meals <- add("Steak") 

的返回值是不可見的,當你將它保存到一個變量,在結束你的功能,但它仍然輸出(如lmhist的完整結果,只有在將它們保存到新變量時纔可以訪問)。這就是爲什麼總是習慣於使用明確的returninvisible聲明結束函數的習慣。

我的猜測是,你來自一種不同的編程語言,在函數內部改變一個全局變量會改變全局變量。該行爲通過明確告訴R用<<-覆蓋該環境行爲,該行爲將當前環境(而不是僅在其內部)之外的值分配給該環境行爲。例如,這樣的:

add <- function(str) { 
    meals <<- append(meals, as.character(str)) 
} 

meals <- "Steak" 

add("Chicken") 

meals 

結果meals同時持有「牛排」和「雞」 - 你想要的行爲。 但是在,這通常是一個壞主意。有時候這種行爲很好,但事實上它與R通常的運作方式有很大的不同,這就給錯誤帶來了很多機會。我偶爾使用這個方法來避開範圍問題(通常在shiny工作,需要改變整個會議的內容,而不僅僅是當前用戶),但我儘量避免它。

我會鼓勵你,相反,只需要使用建築:

meals <- append(meals, str) 

直接,而不是試圖在工作這麼不同於標準的R方法的自定義函數來包裝這個。

相關問題