函数内的R-赋值

8

我需要从一个函数创建一个数据框,输入另一个数据框名称并重塑数据。问题在于我需要将输出命名为输入表名的转换结果。

到目前为止,我的代码如下:

tablaXYZ<-data.frame(a=seq(1,2,1), 'X1'=seq(2,3,1), 'X2'=seq(3,4,1))
rownames(tablaXYZ)<-c('X1', 'X2')

我编写的函数如下:

creaMelts<-function(tbl){
    library(reshape2)
    texto<-deparse(substitute(tbl))
    tbl2<-melt(tbl, id.vars=rownames(tbl))
    texto2<-substr(texto,4,nchar(texto))
    colnames(tbl2)<-c('userId','movieId', texto2)
    tblName<<-paste0('df', texto2)
    print(paste('tblName', tblName, ' '))
    assign(tblName, tbl2)
    return(assign(tblName, tbl2))
}

当我运行以下命令:

creaMelts(tablaXYZ)

I get:

"tblName dflaXYZ  "

因此,考虑到“assign”函数将第二个参数中的对象返回给存储在第一个参数对象中的名称,例如:
 `m<-'hola'`
 assign(m, tablaXYZ)

然后我请求m,我得到:

"hola"

但是如果我搜索 "hola",我会得到这个表格:
hola
   a X1 X2
X1 1  2  3
X2 2  3  4

我认为我将拥有一个名为“dflaXYZ”的数据框,其中包含以下值:

  userId movieId laXYZ NA
1      2       3     a  1
2      3       4     a  2

但是如果我运行:

 dflaXYZ

我只得到了:

我只收到:

"dflaXYZ"

如果我运行例如:

a<-creaMelts(tablaXYZ)

然后请求 "a",我得到了需要的表格。
  userId movieId laXYZ NA
1      2       3     a  1
2      3       4     a  2

我需要获得相同的表格,但在这种情况下命名为dflaXYZ(删除前3个字母并将df添加到输入表格名称中)。

1个回答

11

我们需要使用envir参数来访问函数外部的环境,以便在assign中使用。

creaMelts<-function(tbl){
   library(reshape2)
   texto<-deparse(substitute(tbl))
   tbl2<-melt(tbl, id.vars=rownames(tbl))
   texto2<-substr(texto,4,nchar(texto))
   colnames(tbl2)<-c('userId','movieId', texto2)
   tblName<<-paste0('df', texto2)
    print(paste('tblName', tblName, ' '))
    assign(tblName, tbl2, envir = parent.frame() )

 }

creaMelts(tablaXYZ)
dflaXYZ
#  userId movieId laXYZ NA
#1      2       3     a  1
#2      3       4     a  2

谢谢,但由于我需要在表格列表中使用它,我正在尝试使用obj<-lapply(lista,creaMelts)其中lista=list(tbl1, tbl2, ...),但它不起作用。您知道为什么无法在循环内部使用此函数吗?我应该为此编写另一个问题吗?谢谢。 - GabyLP
4
使用.GlobalEnv代替parent.frame,因为lapply是另一个环境,它是该函数的父环境。 - akrun
仍然存在问题。这部分代码:texto<-deparse(substitute(tbl)) 正在输出"X[[i]]",因此我没有获得任何表格。 - GabyLP
@GabyLP 这是一个不同的问题,因为你的函数是关于assign的。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接