我注意到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中它可以正常工作。
答案 0 :(得分:0)
是的,datatable.setorder
与所有set*
函数一样,通过引用对表进行排序,而data.frame
只是对列的引用的集合。请参见R documentation。对表进行排序当然意味着对表的所有列进行排序,因此对列进行了排序。
答案 1 :(得分:0)
我只是重新运行代码,效果消失了。从现在到我一年前的第一篇文章之间,这个问题似乎已经解决。具体来说是1.10。版本的data.table起作用,在1.11.8中可以正常工作。