data.table :: setorder更改基础变量

时间:2018-02-27 16:30:44

标签: r sorting dataframe data.table

我注意到public static decimal UsdValue = 1; private static readonly Random Rnd = new Random(); private static readonly Timer Timer = new Timer(TimerCallback); private static void TimerCallback(object obj) { // Choose a random percentage between -20% and 76% var pctChange = Rnd.Next(-20, 76) / 100M; var plusSign = pctChange >= 0 ? "+" : ""; // Update our value and log it to console UsdValue += UsdValue * pctChange; Console.WriteLine( $"{DateTime.Now}: USD value is now: {UsdValue:c} ({plusSign}{pctChange:P0})"); // Choose a random value between 1 and 5 minutes (in milliseconds) var waitTime = Rnd.Next(60000, 300001); Console.WriteLine($"{DateTime.Now}: Next update in {waitTime / 60000} minutes."); Console.WriteLine(new string('-', Console.WindowWidth)); // Change the timer interval to the new value Timer.Change(waitTime, Timeout.Infinite); } private static void Main() { // Start timer right away Timer.Change(TimeSpan.Zero, TimeSpan.Zero); Console.ReadKey(); // To keep console window active } 似乎改变了根本不应该触及的变量。一个简单的代码示例解释了这一点:

// Set the next interval to a random value between 1 and 15 seconds (in milliseconds)
var waitTime = Rnd.Next(1000, 15000);
Console.WriteLine($"{DateTime.Now}: Next update in {waitTime / 1000} seconds.");

变量x已重新排序,现在也读取3 2 1。这看起来像setorder命令中的错误。 如果在数据框定义和library(data.table) x <- 1:3 y <- 3:1 data <- data.frame(x.dat=x, y.dat=y) setorder(data, y.dat) x 之间插入一些修改x的附加命令,则效果消失。

编辑:我只是重新运行代码,效果消失了。从现在和一年前的第一篇文章之间的某个时间开始,似乎已经解决了这个问题。具体是1.10。 data.table的版本具有效果,在1.11.8中它可以正常工作。

2 个答案:

答案 0 :(得分:0)

是的,datatable.setorder与所有set*函数一样,通过引用对表进行排序,而data.frame只是对列的引用的集合。请参见R documentation。对表进行排序当然意味着对表的所有列进行排序,因此对列进行了排序。

答案 1 :(得分:0)

我只是重新运行代码,效果消失了。从现在到我一年前的第一篇文章之间,这个问题似乎已经解决。具体来说是1.10。版本的data.table起作用,在1.11.8中可以正常工作。