R-在函数内赋值

Gab*_*yLP 6 r function assign

我需要从输入另一个数据框名称并重塑数据的函数中创建一个数据框。当我需要在输入表名称转换后命名输出时,问题就出现了。到目前为止我的代码是:

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

我写的函数是:

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))
}
Run Code Online (Sandbox Code Playgroud)

当我运行时:

creaMelts(tablaXYZ)
Run Code Online (Sandbox Code Playgroud)

我得到:

"tblName dflaXYZ  "
Run Code Online (Sandbox Code Playgroud)

因此,考虑到“分配”工作在第二位给出的对象中返回,名称存储在第一位的对象中,例如:

 `m<-'hola'`
 assign(m, tablaXYZ)
Run Code Online (Sandbox Code Playgroud)

然后我要求 m,我得到:

"hola"
Run Code Online (Sandbox Code Playgroud)

但是如果我要求“hola”,我会得到一张桌子:

hola
   a X1 X2
X1 1  2  3
X2 2  3  4
Run Code Online (Sandbox Code Playgroud)

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

  userId movieId laXYZ NA
1      2       3     a  1
2      3       4     a  2
Run Code Online (Sandbox Code Playgroud)

但如果我跑:

 dflaXYZ
Run Code Online (Sandbox Code Playgroud)

我只得到:

"dflaXYZ"
Run Code Online (Sandbox Code Playgroud)

如果我运行例如:

a<-creaMelts(tablaXYZ)
Run Code Online (Sandbox Code Playgroud)

然后要求“a”,我得到了想要的表。

  userId movieId laXYZ NA
1      2       3     a  1
2      3       4     a  2
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 6

我们需要使用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
Run Code Online (Sandbox Code Playgroud)

  • @GabyLP 而不是`parent.frame` 使用`.GlobalEnv` 因为`lapply` 是另一个环境,它是函数的parent.frame。 (2认同)