R- 在函数内部赋值
R- assign inside a function
我需要通过输入另一个数据框名称并重塑数据的函数创建数据框。当我需要在转换输入 table 名称后命名输出时,问题就来了。
到目前为止我的代码是:
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 "
因此,考虑 "assign" 返回第二个地方给定的对象,名称存储在第一个地方的对象中,例如:
`m<-'hola'`
assign(m, tablaXYZ)
然后我要求 m,我得到:
"hola"
但是如果我要求 "hola" 我得到 table:
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",我得到了想要的table。
userId movieId laXYZ NA
1 2 3 a 1
2 3 4 a 2
我需要得到相同的 table 但在本例中命名为 dflaXYZ
(删除第一个 3 个字母并将 df
添加到输入 table 名称)。
我们需要为 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
我需要通过输入另一个数据框名称并重塑数据的函数创建数据框。当我需要在转换输入 table 名称后命名输出时,问题就来了。 到目前为止我的代码是:
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 "
因此,考虑 "assign" 返回第二个地方给定的对象,名称存储在第一个地方的对象中,例如:
`m<-'hola'`
assign(m, tablaXYZ)
然后我要求 m,我得到:
"hola"
但是如果我要求 "hola" 我得到 table:
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",我得到了想要的table。
userId movieId laXYZ NA
1 2 3 a 1
2 3 4 a 2
我需要得到相同的 table 但在本例中命名为 dflaXYZ
(删除第一个 3 个字母并将 df
添加到输入 table 名称)。
我们需要为 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