在函数中调用print(ls.str())会影响rep的行为

时间:2017-09-18 13:09:17

标签: r rep

以空的环境开始新的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一样。

3 个答案:

答案 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;之前和之后也允许空格。

因此,可能存在这部分代码的问题,但是我的头脑中只能找到确切的内容。