RStudio 中奇怪的 addTaskCallback 工作
Strange addTaskCallback work in RStudio
这是 "strange" 个问题循环中的下一个问题。
我发现 R 控制台和 RStudio 中的代码执行存在相同差异,但无法理解其中的原因。它还与 RStudio 中的 "track" 包和 R.NET 的错误工作有关,正如我之前在 Incorrect work of track package in R.NET
中所写的
那么,让我们看一下 https://search.r-project.org/library/base/html/taskCallback.html
中的示例
(为了在 RStudio 中正确输出总和数据,我对其进行了一些更正)
times <- function(total = 3, str = "Task a") {
ctr <- 0
function(expr, value, ok, visible) {
ctr <<- ctr + 1
cat(str, ctr, "\n")
if(ctr == total) {
cat("handler removing itself\n")
}
return(ctr < total)
}
}
# add the callback that will work for
# 4 top-level tasks and then remove itself.
n <- addTaskCallback(times(4))
# now remove it, assuming it is still first in the list.
removeTaskCallback(n)
## Not run:
# There is no point in running this
# as
addTaskCallback(times(4))
print(sum(1:10))
print(sum(1:10))
print(sum(1:10))
print(sum(1:10))
print(sum(1:10))
## End(Not run)
R 控制台中的输出:
>
> # add the callback that will work for
> # 4 top-level tasks and then remove itself.
> n <- addTaskCallback(times(4))
Task a 1
>
> # now remove it, assuming it is still first in the list.
> removeTaskCallback(n)
[1] TRUE
>
> ## Not run:
> # There is no point in running this
> # as
> addTaskCallback(times(4))
1
1
Task a 1
>
> print(sum(1:10))
[1] 55
Task a 2
> print(sum(1:10))
[1] 55
Task a 3
> print(sum(1:10))
[1] 55
Task a 4
handler removing itself
> print(sum(1:10))
[1] 55
> print(sum(1:10))
[1] 55
>
> ## End(Not run)
>
好的,让我们在 RStudio 中运行。
输出:
> source('~/callbackTst.R')
[1] 55
[1] 55
[1] 55
[1] 55
[1] 55
Task a 1
>
第二个 运行 给我们这个:
> source('~/callbackTst.R')
[1] 55
[1] 55
[1] 55
[1] 55
[1] 55
Task a 2
Task a 1
>
第三名:
> source('~/callbackTst.R')
[1] 55
[1] 55
[1] 55
[1] 55
[1] 55
Task a 3
Task a 2
Task a 1
>
等等。
RStudio 和 R 控制台之间有一个奇怪的区别,我不知道为什么。谁能帮帮我?是bug还是正常的,我的手是弯曲的?
谢谢。
P.S。这个 post 与 "track" 包的正确工作有关,因为 "track.start" 方法包含这部分代码:
assign(".trackingSummaryChanged", FALSE, envir = trackingEnv)
assign(".trackingPid", Sys.getpid(), envir = trackingEnv)
if (!is.element("track.auto.monitor", getTaskCallbackNames()))
addTaskCallback(track.auto.monitor, name = "track.auto.monitor")
return(invisible(NULL))
我认为这在 RStudio 和 R.NET
中无法正常工作
P.P.S。我使用 R 3.2.2 x64、RStudio 0.99.489 和 Windows 10 Pro x64。在 RRO 上,这个问题在 R.NET 和 RStudio
下也存在
addTaskCallback()
将添加一个在 R 执行 returns 到顶层时执行的回调。当您逐行执行代码时,执行的每个语句都将 return 控制到顶层,并执行回调。
当在 source()
内执行时,直到调用 source()
return 时才 return 控制,因此回调仅 运行一次。
这是 "strange" 个问题循环中的下一个问题。
我发现 R 控制台和 RStudio 中的代码执行存在相同差异,但无法理解其中的原因。它还与 RStudio 中的 "track" 包和 R.NET 的错误工作有关,正如我之前在 Incorrect work of track package in R.NET
中所写的那么,让我们看一下 https://search.r-project.org/library/base/html/taskCallback.html
中的示例(为了在 RStudio 中正确输出总和数据,我对其进行了一些更正)
times <- function(total = 3, str = "Task a") {
ctr <- 0
function(expr, value, ok, visible) {
ctr <<- ctr + 1
cat(str, ctr, "\n")
if(ctr == total) {
cat("handler removing itself\n")
}
return(ctr < total)
}
}
# add the callback that will work for
# 4 top-level tasks and then remove itself.
n <- addTaskCallback(times(4))
# now remove it, assuming it is still first in the list.
removeTaskCallback(n)
## Not run:
# There is no point in running this
# as
addTaskCallback(times(4))
print(sum(1:10))
print(sum(1:10))
print(sum(1:10))
print(sum(1:10))
print(sum(1:10))
## End(Not run)
R 控制台中的输出:
>
> # add the callback that will work for
> # 4 top-level tasks and then remove itself.
> n <- addTaskCallback(times(4))
Task a 1
>
> # now remove it, assuming it is still first in the list.
> removeTaskCallback(n)
[1] TRUE
>
> ## Not run:
> # There is no point in running this
> # as
> addTaskCallback(times(4))
1
1
Task a 1
>
> print(sum(1:10))
[1] 55
Task a 2
> print(sum(1:10))
[1] 55
Task a 3
> print(sum(1:10))
[1] 55
Task a 4
handler removing itself
> print(sum(1:10))
[1] 55
> print(sum(1:10))
[1] 55
>
> ## End(Not run)
>
好的,让我们在 RStudio 中运行。 输出:
> source('~/callbackTst.R')
[1] 55
[1] 55
[1] 55
[1] 55
[1] 55
Task a 1
>
第二个 运行 给我们这个:
> source('~/callbackTst.R')
[1] 55
[1] 55
[1] 55
[1] 55
[1] 55
Task a 2
Task a 1
>
第三名:
> source('~/callbackTst.R')
[1] 55
[1] 55
[1] 55
[1] 55
[1] 55
Task a 3
Task a 2
Task a 1
>
等等。
RStudio 和 R 控制台之间有一个奇怪的区别,我不知道为什么。谁能帮帮我?是bug还是正常的,我的手是弯曲的?
谢谢。
P.S。这个 post 与 "track" 包的正确工作有关,因为 "track.start" 方法包含这部分代码:
assign(".trackingSummaryChanged", FALSE, envir = trackingEnv)
assign(".trackingPid", Sys.getpid(), envir = trackingEnv)
if (!is.element("track.auto.monitor", getTaskCallbackNames()))
addTaskCallback(track.auto.monitor, name = "track.auto.monitor")
return(invisible(NULL))
我认为这在 RStudio 和 R.NET
中无法正常工作P.P.S。我使用 R 3.2.2 x64、RStudio 0.99.489 和 Windows 10 Pro x64。在 RRO 上,这个问题在 R.NET 和 RStudio
下也存在addTaskCallback()
将添加一个在 R 执行 returns 到顶层时执行的回调。当您逐行执行代码时,执行的每个语句都将 return 控制到顶层,并执行回调。
当在 source()
内执行时,直到调用 source()
return 时才 return 控制,因此回调仅 运行一次。