如何修改函数内的参数?

时间:2017-03-28 13:33:44

标签: r function

我有一系列代码,它们根据另一列的内容替换现有列的内容(即我创建了一个分类变量,其中'cut'函数不适用)。我是R的新手,想要编写一个函数,在所有data.frames上执行此任务,而不必每次都插入和自定义50行代码。

X是数据框,Y是分类变量,Z是另一个(字符串)变量。此代码有效:

d.f$loc <- ""
d.f <- transform(d.f, loc=ifelse(county=="Alameda",20,""))
# ... and so on

例如我做:

loc

现在,我想针对多个数据框和不同的列而不是countyab<-function(Y,Z,env=X) { env$Y<-transform(env,Y=ifelse(Z=="Alameda",20,"")) ... } abc<-function(X,Y,Z) { X<-transform(X,Y=ifelse(Z=="Alameda",20,"")) ... } 执行此操作。 但是,这些功能都不会产生预期的结果:

end=

这两个函数都可以正常运行,但不会以任何方式更改数据框X.我在调用环境或在另一个函数中使用函数时做错了吗?这似乎是一个简单的问题,如果我还没有花5个多小时试图学习这个,我就不会发帖。提前谢谢!

1 个答案:

答案 0 :(得分:2)

R对所有对象使用“按值调用” 。只有返回值返回到调用环境。 parameter passing mechanism in R
你可以做到

ab <- function(X, Y, Z) { 
   X <- transform(X, Y=ifelse(Z=="Alameda",20,"")) 
   ... 
   return(X) 
}

如果您的数据框位于列表L中,则可以lapply(L, ab)或最终lapply(L, ab, Y=..., Z=...)结果,您将获得修改后的数据框列表。顺便说一句:还要查看with()within(),例如X$Y <- with(X, ifelse(Z=="Alameda",20,""))

隐式返回值

不需要显式调用return(...) - 你可以隐式调用,即使用函数返回其最后计算表达式的值的问题:

ab <- function(X, Y, Z) { 
   X <- transform(X, Y=ifelse(Z=="Alameda",20,"")) 
   ... 
   X ### <<<<< last expression
}

以下是如何根据您的情况执行此操作的示例:

ab <- function(X, Y, Z) { 
  X[, Y] <- ifelse(X[,Z]>12,20,99) 
  # ... 
  X ### <<<<< last expression
}
B <- BOD # BOD is one of the dataframes which come with R
ab(B, "loc", "demand")