我读了这个关于重命名对象的基本问题和@Shane对它的回答,指着我懒惰的评价.现在我想知道是否assign也懒得评价.就像这里一样:
assign("someNewName",someOldObject)
rm(someOldObject)
Run Code Online (Sandbox Code Playgroud)
为什么我想知道这样做的原因是以下用例:假设我有10K + R对象各自有两个属性叫originalName和additionalName.现在我想编写一个函数,可以有效地让用户从一个名称切换到另一个名称,而不会丢失这两个属性.粗略喜欢这个......
编辑:基于@Hadley的输入我改变了我的代码.
switchObjectName <- function(x) {
n1 <- attributes(x)$originalName
n2 <- attributes(x)$additionalName
objName <- deparse(substitute(x))
if(objName == n1) {
delayedAssign(n2,x,assign.env=.GlobalEnv)
} else {
delayedAssign(n1,x,assign.env=.GlobalEnv)
}
rm(list=c(objName),envir=.GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)
这种方法效果很好,但是我说这rm句话是正确的.rm(objName,envir=.GlobalEnv)虽然objName肯定是一个字符因为它是结果,但我试过但是无法使它工作deparse(substitute(x).
我经常看到新手R程序员的问题,他们习惯于assign创建多个对象,然后在尝试为后续任务操作这些对象时遇到麻烦(最近的一个例子).
assign吸引新手用户,因为它具有动态属性(以编程方式创建变量名称,除了变量的值),并且似乎模仿了全局赋值的一些属性.它的直接名称也使它可能出现在各种问题类型的搜索中.
当然,更有经验的R程序员开始意识到assign创建难以阅读的代码,易于维护的代码,以及通过在高功能R语言中坚决避免的副作用类型的行为.
我在SO最初使用的所有问题上看到的每个问题assign最终在正确使用命名向量,列表或数据帧方面有更好的选择.生成的代码更易于遵循,更易于更改,并且通常性能更高.
所有这一切都是说,很容易找到为什么assign不好的例子.我的问题是:在什么情况下使用assign适当的,首选的或唯一的解决方案?
我只是在R中弄湿了,并且惊讶地看到一个函数没有修改一个对象,至少它似乎是默认的.例如,我写了一个函数只是为了在表中的一个标签上粘贴一个星号; 它在函数内部工作,但表本身不会更改.(我主要来自Ruby)
那么,使用函数来改变R中对象的正常,可接受的方式是什么?如何在表格标题中添加星号?
是否有赋值运算符的函数形式?我希望能够用lapply调用作业,如果这是一个坏主意,我总是很好奇.
编辑:
这是一个玩具示例,显然有更好的方法可以做到这一点:
假设我有一个data.frames,dat列表,每个都对应一次实验.我希望能够添加一个新列"主题",并给它一个假名.我想的方式是这样的
lapply(1:3, function(x) assign(data.frame = dat[[x]], column="subject", value=x)
Run Code Online (Sandbox Code Playgroud)
输出可以是修改数据帧的列表,或者修改可以纯粹是副作用.
列表起始列表的输入
list(structure(list(V1 = c(-1.16664504687199, -0.429499924318301, 2.15470735901367, -0.287839633854442, -0.850578353982526, 0.211636723222015, -0.184714165752958, -0.773553182015158, 0.801811848828454, 1.39420292299319 ), V2 = c(-0.00828185523886259, -0.0215669898046275, 0.743065397283645, -0.0268464140141802, 0.168027242784788, -0.602901928341917, 0.0740511186398372, 0.180307494696194, 0.131160421341309, -0.924995634374182)), .Names = c("V1", "V2"), row.names = c(NA, -10L), class = "data.frame"), structure(list( V1 = c(1.81912921386885, 1.17011641727415, 0.692247839769473, 0.0323050362633069, 1.35816977313292, -0.437475434344363, -0.270255715332778, 0.96140963297774, 0.914691132220417, -1.8014509598977), V2 = c(1.45082316226241, 2.05135744606495, -0.787250759618171, 0.288104852581324, -0.376868533959846, 0.531872044490353, -0.750375220117567, -0.459592764008714, 0.991667163481123, 1.31280356980115)), .Names = c("V1", "V2" ), row.names …Run Code Online (Sandbox Code Playgroud) 鉴于这两个对象:
v <- "new.name"
w <- 1:10
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉我R将w重命名为new.name,所以我可以拥有它
> new.name
[1] 1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
谢谢
我在一个目录中有大量数据文件(> 1000).我想将它们全部合并到R中的单个数据框中.它们都具有相同数量和类型的列.到目前为止我所拥有的是:
setwd("directory")
files <- list.files()
for (i in 1:length(files)) assign(files[i], read.csv(files[i]))
Run Code Online (Sandbox Code Playgroud)
这将为1000多个文件中的每个文件创建数据框.有没有办法合并它们,而不必输入所有1000多个文件名列表?
任何帮助,将不胜感激!
所以我对此非常新,但我正在尝试使用顺序名称制作一堆对象.Box1到Box100,每个都是一个包含c(0,0)的对象.我的第一个是做一个for循环
for (i in 1:100 ) {
Box"i" <- c(0,0)
}
Run Code Online (Sandbox Code Playgroud)
显然Box"i"不是有用的东西,我很难弄清楚如何正确地做到这一点.任何帮助,将不胜感激.