我創建了以下函數來在名爲「飯食」的字符串矢量上附加新字符串。但是,當我使用此函數將字符串輸入附加到我的「膳食」向量時,它不起作用。這個R函數爲什麼不起作用?
add <- function(str) {
meals <- append(meals, as.character(str))
}
我創建了以下函數來在名爲「飯食」的字符串矢量上附加新字符串。但是,當我使用此函數將字符串輸入附加到我的「膳食」向量時,它不起作用。這個R函數爲什麼不起作用?
add <- function(str) {
meals <- append(meals, as.character(str))
}
你需要確保你分配功能輸出到你的情況的變量嘗試一些像這樣的(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
。
在這種情況下使用return是不必要的。這個答案會打印該值,但會讓用戶改變str。覈實。它保持不變。 –
良好的通話,更新它。 – TBSRounder
[有趣的討論是否完全使用返回()或不](http://stackoverflow.com/questions/11738823/explicitly-calling-return-in-a-function-or-not) – TBSRounder
它不起作用?
有一點需要考慮:函數的輸出是函數的最後一行。例如:
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
所以,你需要爲了得到它,使之功能外增加餐點的最後一行在你的函數。
這裏的問題是變量作用域。變量meals
存在於您正在使用它的全局環境中。當你運行你的函數時,函數環境中沒有meals
變量,所以它從全局環境繼承該變量。但是,當它修改變量時,它會在函數環境內創建新版本。該函數然後可以使用該修改後的版本,但不會從全局環境中更改meals
變量。
所以,你可以使用此功能,因爲它是目前寫的,只是結果保存到meals
像這樣:
meals <- add("Steak")
的返回值是不可見的,當你將它保存到一個變量,在結束你的功能,但它仍然輸出(如lm
或hist
的完整結果,只有在將它們保存到新變量時纔可以訪問)。這就是爲什麼總是習慣於使用明確的return
或invisible
聲明結束函數的習慣。
我的猜測是,你來自一種不同的編程語言,在函數內部改變一個全局變量會改變全局變量。該行爲通過明確告訴R用<<-
覆蓋該環境行爲,該行爲將當前環境(而不是僅在其內部)之外的值分配給該環境行爲。例如,這樣的:
add <- function(str) {
meals <<- append(meals, as.character(str))
}
meals <- "Steak"
add("Chicken")
meals
結果meals
同時持有「牛排」和「雞」 - 你想要的行爲。 但是在,這通常是一個壞主意。有時候這種行爲很好,但事實上它與R通常的運作方式有很大的不同,這就給錯誤帶來了很多機會。我偶爾使用這個方法來避開範圍問題(通常在shiny
工作,需要改變整個會議的內容,而不僅僅是當前用戶),但我儘量避免它。
我會鼓勵你,相反,只需要使用建築:
meals <- append(meals, str)
直接,而不是試圖在工作這麼不同於標準的R方法的自定義函數來包裝這個。
這兩個評論都錯過了這一點。該功能將起作用,但需要以功能性方式應用,即:'飯食< - 添加(c(「午餐」,「晚餐」))' –
因爲它會返回'append'調用的值。嘗試它並閱讀'?'< - '' –
我把這個問題擱置的問題。這不是一個錯字。至少有兩位評論者(現在已經刪除了他們的評論)展示了R功能如何返回值,並且還由於也錯過了這個方面的兩個答案展示了這一點。它可以作爲一個有用的例子,但現在封閉似乎正在把它掃到地毯下。僅僅因爲提問者不理解這一點並不是一個微不足道的問題。這實際上是一個相當深刻的問題,它的正確答案表明了R和大多數其他計算機語言之間的根本區別。 –