我需要从输入另一个数据框名称的函数创建数据框并重新整形数据。当我需要在输入表名称转换后命名输出时出现问题。 到目前为止我的代码是:
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 "
所以,考虑&#34;分配&#34;在第二个位置给出的对象中返回,其名称存储在第一个位置的对象中,如:
`m<-'hola'`
assign(m, tablaXYZ)
然后我问我,我明白了:
"hola"
但如果我要求&#34; hola&#34;我拿到了桌子:
hola
a X1 X2
X1 1 2 3
X2 2 3 4
我以为我会有一个名为&#34; dflaXYZ&#34;的数据框。值:
userId movieId laXYZ NA
1 2 3 a 1
2 3 4 a 2
但如果我跑:
dflaXYZ
我只得到:
"dflaXYZ"
如果我跑的例子:
a<-creaMelts(tablaXYZ)
然后要求&#34; a&#34;,我得到了理想的表格。
userId movieId laXYZ NA
1 2 3 a 1
2 3 4 a 2
我需要获得相同的表,但在这种情况下命名为dflaXYZ
(删除前3个字母并将df
添加到输入表名称中。)
答案 0 :(得分:2)
我们需要使用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