以空的环境开始新的R会话。使用参数编写一系列函数,该参数将用作times
调用中rep()
参数的值。
f <- function(n) {
rep("hello", times = n)
}
f(x)
有人希望这会失败,事实上会得到:
# Error in f(x) : object 'x' not found
稍微修改一下这个函数:
f2 <- function(n) {
ls.str()
rep("hello", times = n)
}
f2(x)
正如所料,它仍然失败:
# Error in f2(x) : object 'x' not found
稍微修改一下(以查看控制台中的环境):
f3 <- function(n) {
print(ls.str())
rep("hello", times = n)
}
f3(x)
我仍然期待失败,而是得到:
## n : <missing>
## [1] "hello"
就好像对print()
的调用使代表工作好像times
设置为1一样。
答案 0 :(得分:6)
这不是一个答案,但作为评论发布时间太长。一个可重复性最小的例子是:
f3 <- function(n) {
try(get("n", environment(), inherits=FALSE))
rep("hello", times = n)
}
f3(x)
## Error in get("n", environment(), inherits = FALSE) : object 'x' not found
## [1] "hello"
以下是推测性的,并基于对do_rep
的来源的松散检查。 get
启动承诺评估,但未找到&#34;缺少&#34;符号似乎使承诺部分无价值。 rep
,作为一个原始的,然后尝试在n
上进行操作,却没有意识到它是一个部分评估的承诺,并且基本上隐含地导致假设&n = = 1&#39;。
此外,这表明承诺处于一种奇怪的状态(必须使用browser
/ debug
才能看到它):
f3a <- function(n) {
try(get("n", environment(), inherits=FALSE))
browser()
rep("hello", times = n)
}
f3a(x)
## Error in get("n", environment(), inherits = FALSE) : object 'x' not found
## Called from: f3a(x)
# Browse[1]> (n)
## Error: object 'x' not found
## In addition: Warning message:
## restarting interrupted promise evaluation
## Browse[1]> c
## [1] "hello"
答案 1 :(得分:6)
我今天早些时候收到一份报告称该错误已在R-devel和R-patched中得到修复。
问题在于R源中缺失的测试没有考虑中断promise evaluation的情况。由Luke Tierney修复has been committed,可以看到on GitHub。
答案 2 :(得分:2)
-- app.component.ts --
<app-navbar></app-navbar>
<router-outlet></router-outlet>
-- navbar.html--
<ul class="nav pull-left">
<li class="dropdown pull-right">
<a href="#" data-toggle="dropdown" class="dropdown-toggle">
<span *ngIf="!_selectedCity">Choose a city</span>
<span *ngIf="_selectedCity">{{ _selectedCity.name }}</span>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li routerLinkActive="active" *ngFor="let city of _cities"><a [routerLink]="['', city.name]" (click)="selectCity(city)">{{ city.name }}</a></li>
</ul>
</li>
</ul>
f4 <- function(n) {
print('test')
print(ls.str())
print('end test')
rep("hello", times = n)
}
f4(x)
## [1] "test"
## n : <missing>
## [1] "end test"
## [1] "hello"
中有一些内容,来自Frank的聊天测试中,以下代码显示同样的问题:
print.ls_str
在R源代码中挖掘一点我发现了following code
f6 <- function(n) {
z = tryCatch(get("n", new.env(), mode = "any"), error = function(e) e)
rep("A", n)
}
我很惊讶这个编译正确,据我记得(我的C远远落后)# define GET_VALUE(rval) \
/* We need to evaluate if it is a promise */ \
if (TYPEOF(rval) == PROMSXP) { \
PROTECT(rval); \
rval = eval(rval, genv); \
UNPROTECT(1); \
} \
\
if (!ISNULL(rval) && NAMED(rval) == 0) \
SET_NAMED(rval, 1)
GET_VALUE(rval);
break;
case 2: // get0(.)
if (rval == R_UnboundValue)
return CAD4R(args);// i.e. value_if_not_exists
GET_VALUE(rval);
break;
}
return rval;
}
#undef GET_VALUE
不允许#define
和#
之间的空格定义击>
在挖掘之后,我错了,来自gcc doc:
在#&#39;之前和之后也允许空格。
因此,可能存在这部分代码的问题,但是我的头脑中只能找到确切的内容。