- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每隔一段时间,我就会遇到 R 具有修改时复制语义的概念,例如 Hadley's devtools wiki .
Most R objects have copy-on-modify semantics, so modifying a function argument does not change the original value
我可以将该术语追溯到 R-Help 邮件列表。例如,Peter Dalgaard 在 July 2003 中写道:
R is a functional language, with lazy evaluation and weak dynamic typing (a variable can change type at will: a <- 1 ; a <- "a" is allowed). Semantically, everything is copy-on-modify although some optimization tricks are used in the implementation to avoid the worst inefficiencies.
类似地,Peter Dalgaard 在 Jan 2004 中写道:
R has copy-on-modify semantics (in principle and sometimes in practice) so once part of an object changes, you may have to look in new places for anything that contained it, including possibly the object itself.
更进一步,在 Feb 2000 中罗斯·伊哈卡说道:
We put quite a bit of work into making this happen. I would describe the semantics as "copy on modify (if necessary)". Copying is done only when objects are modified. The (if necessary) part means that if we can prove that the modification cannot change any non-local variables then we just go ahead and modify without copying.
说明书上没有
无论我如何努力搜索,我都无法在 R manuals 中找到对“修改时复制”的引用。 ,都不在 R Language Definition 中也不在 R Internals
问题
我的问题分为两部分:
例如,谈论“按引用传递”是否合适,因为 promise 被传递给函数?
最佳答案
R Language Definition这么说(在 4.3.3 Argument Evaluation 部分)
The semantics of invoking a function in R argument are call-by-value. In general, supplied arguments behave as if they are local variables initialized with the value supplied and the name of the corresponding formal argument. Changing the value of a supplied argument within a function will not affect the value of the variable in the calling frame. [Emphasis added]
虽然这没有描述修改时复制的工作机制,但它确实提到更改传递给函数的对象不会影响调用框架中的原始对象。
其他信息,特别是关于修改时复制方面的信息,请在 R Internals manual 中的 SEXP
描述中给出。 ,部分1.1.2 Rest of Header 。具体来说,它指出[强调]
The
named
field is set and accessed by theSET_NAMED
andNAMED
macros, and take values0
,1
and2
. R has a 'call by value' illusion, so an assignment likeb <- a
appears to make a copy of
a
and refer to it asb
. However, if neithera
norb
are subsequently altered there is no need to copy. What really happens is that a new symbolb
is bound to the same value asa
and thenamed
field on the value object is set (in this case to2
). When an object is about to be altered, thenamed
field is consulted. A value of2
means that the object must be duplicated before being changed. (Note that this does not say that it is necessary to duplicate, only that it should be duplicated whether necessary or not.) A value of0
means that it is known that no otherSEXP
shares data with this object, and so it may safely be altered. A value of1
is used for situations likedim(a) <- c(7, 2)
where in principle two copies of a exist for the duration of the computation as (in principle)
a <- `dim<-`(a, c(7, 2))
but for no longer, and so some primitive functions can be optimized to avoid a copy in this case.
虽然这没有描述对象作为参数传递给函数的情况,但我们可以推断出相同的过程在运行,特别是考虑到前面引用的 R 语言定义中的信息。
我认为将promise传递给函数的说法不太正确。参数被传递给函数,实际使用的表达式被存储为 Promise(加上指向调用环境的指针)。只有当参数被求值时,存储在 Promise 中的表达式才会在指针指示的环境中被检索和求值,这个过程称为强制。
因此,我认为在这方面谈论“按引用传递”是不正确的。 R 具有按值调用语义,但会尝试避免复制,除非对传递给参数的值进行求值和修改。
NAMED 机制是一种优化(正如 @hadley 在评论中指出的那样),它允许 R 跟踪修改后是否需要进行复制。正如 Peter Dalgaard 所讨论的那样,NAMED 机制的具体运作方式涉及一些微妙之处(在 R Devel thread @mnel 在他们对问题的评论中引用)
关于r - R 中的修改时复制语义到底是什么?规范来源在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15759117/
我们有一个 Java 项目,每天晚上使用 TeamCity 对 Java 类进行静态分析,以查找代码中容易出现的错误。我们想告诉 TeamCity 寻找开发人员可能引入的与 == 与 .equals
前言 🍊缘由 Git分支管理好,走到哪里都是宝 🏀事情起因: 最近翻看博客中小伙伴评论时,发现文章【规范】看看人家Git提交描述,那叫一个规矩一条回复: 本狗亲测在我司中使用规范
使用带有不存在的命名空间的命名空间限定关键字来定义规范是否被认为是不好的做法?我想在公共(public) domain 命名空间中定义实体映射...所以为了避免在合并规范时丢失数据,我使用约定 :en
有没有办法在调用 clojure.spec.test.alpha/check 时覆盖核心谓词函数的生成器? 可以通过 s/gen 中的路径覆盖谓词生成器: (gen/generate (s/gen
以内核 rpm 为例,它允许在一个系统上同时安装多个版本。规范文件中究竟是什么允许的? 我想打包一个已经存在的具有不同安装前缀的多个版本的项目。 最佳答案 百胜 找到了让 yum 安装而不是更新的方法
我正在尝试用 C# 编写 PDF 解析器,但我遇到了一个问题,我不确定如何解释规范。 除非另有说明,否则 PDF 文档中的用户空间为 1/72 英寸(即 1pt)。 Tf 运算符提供的比例将字体从标准
我正在编写一些代码,需要能够获取两个 pdf 并将它们附加到页面级别(例如,如果它们都是 2 页文档,则有一个 4 页文档,其中所有 4 页都与原始文档相同). 在不使用库的情况下,最好的方法是什么?
是否有序言语言语法,或接近它的通常用作引用的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则一般的 prolog 语言语法/规范也能工作。 最佳答案 自 1995 年起,P
我需要一个函数来过滤参数和构建查询。我有 4 个参数,因此如果我尝试为每个条件实现查询,我将不得不写 16 (2^4)实现 - 这不是一个好主意。 我尝试使用界面改进我的代码 Specificatio
这个 ExtGState 对象对图像做了什么: > 我有 PDF 规范,但一点也不清楚。显然,这将身份函数(什么的身份?单位矩阵?)从 [0.0 1.0] 映射到 [0.0 1.0](相同),这是没有
只是想获得有关 ePub 规范的一些帮助。toc.ncx 是否必须具有 src(即 xhtml)。我观察到 .opf 文件中也提供了相同的内容 src。 最佳答案 是的,这是强制性的,这是一个设计问题
让我们看看莱宁根项目 map 的真实示例 :global-vars : ;; Sets the values of global vars within Clojure. This example
我正在开发一个 LOB 框架,它具有 SL 和 MVC 前端、WCF 后端以及在服务器上运行的几个服务模块。我一直在查看 Spec#,看它是否对我有任何帮助。不可空类型和检查异常本身非常好,但我还没有
Promises/A+规范是最小的规范之一。因此,实现它是理解它的最佳方法。福布斯·林德赛(Forbes Lindesay)的以下回答将引导我们完成实现Promises / A +规范Basic Ja
哪个文档指定了 MySQL definer 格式? 具体来说,definer admin@% 中的 % 是什么意思(以及为什么使用这个符号)? 最佳答案 这里MySQL使用的格式定义在the MySQ
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 css 规范中,什么会影响更多的 inline 样式或外部 !important 外部“style.css”: #di{color: green!important;} div 文本颜色是红色还
我正在努力思考 CSS 的一些细节,我从 W3 CSS Visual Formatting Spec 9.2.2 中找到了这部分摘录。特别迟钝: Inline-level boxes that are
这个问题在这里已经有了答案: Are (non-void) self-closing tags valid in HTML5? (8 个答案) 关闭 9 年前。 在 HTML5 中你应该使用 或
以下样式在规范方面有何不同? ul .active { background: #E7F3EF;} ul li.active { background: #E7F3EF;} Item 1
我是一名优秀的程序员,十分优秀!