1

我正在处理一堆 SAS 数据集,我更喜欢变量名都是小写的,使用read.sas7bdat,但我经常这样做,我想编写一个函数。这个方法很好用,

df <- data.frame(ALLIGATOR=1:4, BLUEBIRD=rnorm(4))
names(file1) <- tolower(names(file1))

但是当我尝试将它放入一个没有分配的函数中时。

lower <- function (df) {names(df) <- tolower(names(df))}
lower(file1)

我知道我遗漏了一些更大的概念,它阻碍了我。它似乎没有做任何事情。

4

3 回答 3

6

R 中的参数通过副本传递。你所要做的:

lower <- function (df) {
  names(df) <- tolower(names(df))
  df
}
file1 <- lower(file1)
于 2013-09-13T14:06:03.080 回答
3

虽然我不明白你为什么要这样做而不是简单地 : names(df) <- tolower(names(df)),但我认为你应该这样做:

 lower <- function (x) {tolower(names(x))}
 names(df) <- lower(df)
于 2013-09-13T13:59:57.950 回答
0

这是一个我不建议在除 the 以外的globalenvironment任何地方使用的答案,但它确实为您提供了一些方便的速记。基本上我们负责函数内部的赋值,覆盖传递给它的对象。简写给你,但请注意你如何使用它:

tl <- function(x){
  ass <- all.names(match.call()[-1])
  assign( ass , setNames( x , tolower(names(x))) , env = sys.frame(sys.parent()) )
}

#  This will 'overwrite' the names of df...    
tl(df)

#  Check what df now looks like...
df
  alligator   bluebird
1         1  0.2850386
2         2 -0.9570909
3         3 -1.3048907
4         4 -0.9077282
于 2013-09-13T15:05:47.030 回答