【问题标题】:R- assign inside a functionR- 在函数内部赋值
【发布时间】:2016-11-12 19:03:45
【问题描述】:

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

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)

我明白了:

"tblName dflaXYZ  "

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

 `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 添加到输入表名)。

【问题讨论】:

    标签: r function assign


    【解决方案1】:

    我们需要为assign 使用envir 参数来访问函数外部的环境。

    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
    • @GabyLP 而不是 parent.frame 使用 .GlobalEnv 因为 lapply 是另一个环境,它是函数的 parent.frame。
    • 仍有问题。这部分: texto
    • @GabyLP 这是一个不同的问题,因为你的功能是关于assign
    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2023-04-11
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多