【问题标题】:What is the functional form of the assignment operator, [<-?赋值运算符 [<-?
【发布时间】:2015-10-02 06:11:05
【问题描述】:

赋值运算符有函数形式吗?我希望能够用 lapply 调用 assignment,如果这是一个坏主意,我还是很好奇。

编辑:

这是一个玩具示例,显然有更好的方法可以做到这一点:

假设我有一个 data.frames 的列表,dat,每个对应于一次实验。我希望能够添加一个新列“主题”,并给它一个假名。我的想法是这样的

lapply(1:3, function(x) assign(data.frame = dat[[x]], column="subject", value=x)

输出可能是修改后的数据帧列表,或者修改可能纯粹是副作用。

列表起始列表的输入

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 = c(NA, -10L), class = "data.frame"), structure(list(     V1 = c(0.528912899341174, 0.464615157920766, -0.184211714281637,      0.526909095449027, -0.371529800682086, -0.483772861751781,      -2.02134822661341, -1.30841566046747, -0.738493559993166,      -0.221463545903242), V2 = c(-1.44732101816006, -0.161730785376045,      1.06294520132753, 1.22680614207705, -0.721565979363022, -0.438309438404104,      -0.0243401435910825, 0.624227513999603, 0.276605218579759,      -0.965640602482051)), .Names = c("V1", "V2"), row.names = c(NA,  -10L), class = "data.frame"))

【问题讨论】:

  • 你能举一个你期望的调用和输出的例子(显然不必工作)吗?
  • 我同意@hrbrmstr,因为可能存在误解。您是指分配功能/运算符还是替换功能?
  • 替换运算符只是`[&lt;-`,但这不会改变变量的值。 a&lt;-1:3; `[&lt;-`(a,1,5)。但目前还不清楚您到底想要完成什么。
  • 使用[&lt;- 时可能会调用各种R 函数。你可以通过输入methods("[&lt;-")查看他们的名字
  • 这个相关答案解释了替换函数以及如何以这种方式调用它们。 stackoverflow.com/a/10491881/210673

标签: r


【解决方案1】:

也许我不明白,但正如“R 编程的艺术”中所述:

任何左边不只是一个 标识符(意思是变量名)被认为是替代品 功能。

所以事实上你总是可以翻译这个:

names(x) <- c("a","b","ab")

到这里:

x <- "names<-"(x,value=c("a","b","ab"))

一般规则就是"function_name&lt;-"(&lt;object&gt;, value = c(...))

编辑评论:

它也适用于"

> x <- c(1:3)
> x
[1] 1 2 3
> names(x) <- c("a","b","ab")
> x
 a  b ab 
 1  2  3 
> x
 a  b ab 
 1  2  3 
> x <- c(1:3)
> x
[1] 1 2 3
> x <- "names<-"(x,value=c("a","b","ab"))
> x
 a  b ab 
 1  2  3 

【讨论】:

  • 甜蜜。我最终使用的调用是 tmp = lapply(1:3, function(x) [&lt;-.data.frame(dat[[3]], "subject", value=x))
  • 注意:你必须反引号操作符才能让它像一个函数一样工作,而不是使用引号。
【解决方案2】:

assign 函数。我认为使用它没有任何问题,但您必须知道要分配到什么环境。语法见帮助?assign

仔细阅读本章以详细了解环境的来龙去脉。 http://adv-r.had.co.nz/Environments.html

【讨论】:

  • 也许我错了,但我认为 OP 想知道替换函数而不是分配函数。但我当然可能是错的。
  • 他实际上同时使用了这两个术语,标题中的替换运算符和文本中的赋值运算符。
  • 是的,我有点不一致。我对两者都很好奇,但我想到的具体例子是作业。
猜你喜欢
  • 2011-08-02
  • 2019-10-06
  • 2011-11-16
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-07-29
  • 2012-01-24
相关资源
最近更新 更多