我创建了以下函数,在称为“meal”的字符串向量上附加新字符串。但是,当我使用此函数将字符串输入附加到我的“meal”向量中时,它不起作用。
add <- function(str) {
meals <- append(meals, as.character(str))
}
答案 0 :(得分:1)
这里的问题是变量范围。变量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
同时持有&#34; Steak&#34;和#34;鸡肉&#34; - 你想要的行为。 HOWEVER ,这在R中通常是一个坏主意。有时候这种行为很好,但事实上它与R一般运作的方式非常不同,这使得很多错误的机会滑入我偶尔使用它来解决范围问题(通常是在shiny
工作并且需要为整个会话而不仅仅是当前用户进行更改),但我尽量避免使用它。< / p>
我鼓励你改为使用这个结构:
meals <- append(meals, str)
直接,而不是试图将其包装在一个自定义函数中,该函数与标准R方法的工作方式不同。
答案 1 :(得分: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)
将返回相同的确切内容。 append
通常仅在您需要使用after
参数时使用。
答案 2 :(得分:0)
它怎么行不通?
要考虑的一件事:函数的输出是函数的最后一行。例如:
x.plus.3 <- function(x){
s <- x+3
}
x.plus.3(2)
# nothing is printed
这是一个有效的函数但如果run没有输出,因为所有函数都将x + 3存储到对象中。
但是,如果我将其更改为:
x.plus.3 <- function(x){
s <- x+3
s
}
x.plus.3(2)
[1] 5 # i get the result printed
因此,您需要添加膳食作为您功能的最后一行,以使其在功能之外使用。