“打印"的时间和原因是什么?需要两次尝试打印“data.table"? [英] When and why does "print" need two attempts to print a "data.table"?
问题描述
有时 print
需要两次尝试打印 data.table
:
Sometimes print
needs two attempts to print a data.table
:
> library(data.table)
>
> rm(list=ls())
>
> Tbl <- fread( input = "Nr; Value
+ Nr 1;46.73
+ Nr 2;49.02
+ Nr 3;50.62
+ Nr 4;49.80
+ Nr 5;50.15",
+ sep = ";",
+ header = TRUE,
+ colClasses = c("character","numeric") )
> print(Tbl)
Nr Value
1: Nr 1 46.73
2: Nr 2 49.02
3: Nr 3 50.62
4: Nr 4 49.80
5: Nr 5 50.15
> Tbl <- Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))]
> print(Tbl)
> print(Tbl)
Nr Value
1: 1 46.73
2: 2 49.02
3: 3 50.62
4: 4 49.80
5: 5 50.15
>
不是data.frame
:
> rm(list=ls())
>
> DF <- read.table( text = "Nr; Value
+ Nr 1;46.73
+ Nr 2;49.02
+ Nr 3;50.62
+ Nr 4;49.80
+ Nr 5;50.15",
+ sep = ";",
+ header = TRUE,
+ colClasses = c("character","numeric"))
>
> DF$Nr <- as.numeric( gsub( "Nr ", "", DF$Nr ))
> print(DF)
Nr Value
1 1 46.73
2 2 49.02
3 3 50.62
4 4 49.80
5 5 50.15
>
如果代码包含在脚本文件中,则立即打印 data.table
:
If the code is contained in a script file, the data.table
is printed immediately:
> source(path_to_Script_1,echo=TRUE,prompt.echo="(script) ",max.deparse.length=500)
(script) library(data.table)
(script) rm(list=ls())
(script) Tbl <- fread( input = "Nr; Value
+ Nr 1;46.73
+ Nr 2;49.02
+ Nr 3;50.62
+ Nr 4;49.80
+ Nr 5;50.15",
+ sep = ";",
+ header = TRUE,
+ colClasses = c("character","numeric") )
(script) Tbl <- Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))]
(script) print(Tbl)
Nr Value
1: 1 46.73
2: 2 49.02
3: 3 50.62
4: 4 49.80
5: 5 50.15
>
但如果 print(Tbl)
从脚本文件中省略,控制台上的 print
再次需要两次尝试:
But if print(Tbl)
is omitted from the script file, print
on the console again needs two attempts:
> source(path_to_Script_2,echo=TRUE,prompt.echo="(script) ",max.deparse.length=500)
(script) library(data.table)
(script) rm(list=ls())
(script) Tbl <- fread( input = "Nr; Value
+ Nr 1;46.73
+ Nr 2;49.02
+ Nr 3;50.62
+ Nr 4;49.80
+ Nr 5;50.15",
+ sep = ";",
+ header = TRUE,
+ colClasses = c("character","numeric") )
(script) Tbl <- Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))]
> print(Tbl)
> print(Tbl)
Nr Value
1: 1 46.73
2: 2 49.02
3: 3 50.62
4: 4 49.80
5: 5 50.15
>
谁能告诉我什么时候以及为什么 print
需要两次尝试?我正在使用 R 版本 3.2.2:
Can anybody tell me when ans why print
needs two attempts?
I'm using R version 3.2.2:
> R.version
_
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 2.2
year 2015
month 08
day 14
svn rev 69053
language R
version.string R version 3.2.2 (2015-08-14)
nickname Fire Safety
操作系统是Windows 7.
Operating system is Windows 7.
推荐答案
引用NEWS (1. 1.9.6版本的bug修复):
Quoting the NEWS (1. bug fix in version 1.9.6):
if (TRUE) DT[,LHS:=RHS]
不再打印,#869 和 #1122.添加了测试.为了让它工作,我们不得不忍受一个缺点:如果 :=
是在函数结束前没有 DT[]
的函数内部使用,那么下次在提示符下键入 DT
或 print(DT)
时,什么也没有将被打印.将打印重复的 DT
或 print(DT)
.为了避免这种情况:在函数的最后一个 :=
之后包含一个 DT[]
.如果那不是可能(例如,它不是您可以更改的功能)然后 DT[]
在prompt 保证打印出来.
if (TRUE) DT[,LHS:=RHS]
no longer prints, #869 and #1122. Tests added. To get this to work we've had to live with one downside: if a:=
is used inside a function with noDT[]
before the end of the function, then the next timeDT
orprint(DT)
is typed at the prompt, nothing will be printed. A repeatedDT
orprint(DT)
will print. To avoid this: include aDT[]
after the last:=
in your function. If that is not possible (e.g., it's not a function you can change) thenDT[]
at the prompt is guaranteed to print.
<-
是一个函数.当然,你根本不应该在那里使用 <-
.它创建了一个不必要的副本(因为 :=
修改了 data.table 列),因此效率低下.
<-
is a function. Of course, you shouldn't use <-
there at all. It creates an unnecessary copy (since :=
modifies the data.table column in place) and is therefore inefficient.
这篇关于“打印"的时间和原因是什么?需要两次尝试打印“data.table"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!