为什么这个R功能不起作用?

时间:2016-09-30 16:22:13

标签: r

我创建了以下函数,在称为“meal”的字符串向量上附加新字符串。但是,当我使用此函数将字符串输入附加到我的“meal”向量中时,它不起作用。

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

3 个答案:

答案 0 :(得分:1)

这里的问题是变量范围。变量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同时持有&#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

因此,您需要添加膳食作为您功能的最后一行,以使其在功能之外使用。