R代码:为什么我的函数不产生错误和结果?

R代码:为什么我的函数不产生错误和结果?,r,function,R,Function,我正在写一个函数,遇到了一些问题。我的函数不创建新变量,在运行它之后,没有任何错误和更改,就像我从未运行过一样。函数之前的代码运行得很好,如果我直接通过代码传递参数(绕过代码的函数方面),它将完美地运行 你觉得我遗漏了什么吗?我已经看了两天了,已经没有办法尝试了。如有任何建议,将不胜感激 path <- "C:/Documents/Data" readFile <- paste(path,"/opps.csv",sep="") oppsQty <- read.csv(file=

我正在写一个函数,遇到了一些问题。我的函数不创建新变量,在运行它之后,没有任何错误和更改,就像我从未运行过一样。函数之前的代码运行得很好,如果我直接通过代码传递参数(绕过代码的函数方面),它将完美地运行

你觉得我遗漏了什么吗?我已经看了两天了,已经没有办法尝试了。如有任何建议,将不胜感激

path <- "C:/Documents/Data"
readFile <- paste(path,"/opps.csv",sep="")
oppsQty <- read.csv(file=readFile,sep=",")

oppsQty$Line.Created.date <- as.Date(as.character(oppsQty$Line.Created),
                                     "%m/%d/%Y")

opQty002.0084.01 <- oppsQty[oppsQty$Part=="002-0084-01",]

 productNumberData <- function(nameNum,prodNum){
    # CREATING YEAR VARIABLE #
    year2009 <- ifelse((nameNum$Line.Created.date <= 
                        as.Date("12/30/2009","%m/%d/%Y")),"2009","0")
    year2010 <- ifelse((nameNum$Line.Created.date > 
                        as.Date("12/30/2009","%m/%d/%Y")&
                        nameNum$Line.Created.date <= 
                        as.Date("12/30/2010","%m/%d/%Y")),"2010",year2009)
    year2011 <- ifelse((nameNum$Line.Created.date > 
                        as.Date("12/30/2010","%m/%d/%Y")&
                        nameNum$Line.Created.date <= 
                        as.Date("12/30/2011","%m/%d/%Y")),"2011",year2010)
    nameNum$line.YEAR <- ifelse((nameNum$Line.Created.date > 
                                as.Date("12/30/2011","%m/%d/%Y")&
                                nameNum$Line.Created.date <= 
                                as.Date("12/30/2012","%m/%d/%Y")),"2012",year2011)
 }
 productNumberData(opQty002.0084.01,"002-0084-01")
 #opQty002.0084.01$line.YEAR does not exist

path您在这里看到的是所谓范围界定的结果。在任何像样的编程语言(包括R)中,变量都不是全局有效的。相反,变量存在于某个范围内。您正在创建的变量是函数范围的一部分。因此,在您尝试使用它的函数之外找不到它,这会导致错误。R中的作用域规则允许引用函数外部的变量,其中函数外部的变量仅在函数范围内没有具有该名称的变量时使用

作用域缩小了较大R脚本中代码段之间的依赖关系。通过这种方式,函数中的代码在其他函数中引起不必要的副作用的可能性要小得多

我将使用的解决方案是将您创建的所有对象放在一个更大的数据结构中,可能是一个
列表
。代码将类似于:

spam = function(object_in) {
  A = f(object_in)
  B = g(object_in)
  list(A, B)
 }
result = spam(obj)
result[["A"]]

请在您的问题中添加相关的语言标签。非常感谢您的回答!我在上面的代码中创建了一个名为line.YEAR的列表版本,并将其附加到数据集nameNum,但是即使在我运行该函数之后,它也不存在于数据集中。我理解作用域的问题,但如果我将其附加到函数内的数据集,作用域是否仍然适用?如果要更改函数范围外的对象,需要明确引用它,即函数内的
opQty002.0084.01$line.YEAR
。不过,我建议不要这样做,因为从函数内部更改外部对象可能会产生令人讨厌的副作用,尤其是当脚本变大时。最好让函数具有输入参数,并返回一个对象。