2016-12-16 5 views
1

私は線形回帰直線y = m * x + bを描きたいと思います。xはdata.tableとmとbの列から来ています。私はこのプログラムを実行すると: weird stuff ねえ、私は直線y = MX + Bを描画していますので、データの真の姿にすることはできません。R data.tableはlines()に奇妙なものを描画させます

library(data.table) 

dt = data.table(KEY_COLUMN = c("a","c","d","e","b"), 
       x = c(29.34224, 26.77573, 25.45568, 26.27839, 28.22389) 
       ) 
x = dt$x 
m = -0.1211562 
b = 63.09729 
plot(c(25,30), c(58,61)) 
lines(x, m*x + b, col="red") 
setkeyv(dt, "KEY_COLUMN") 

は、私はこの奇妙な絵を入手します!さらにぎこちなく

、その後、すべてのwirks BEHIND線画を、起こるコマンドsetkeyv(dt, "KEY_COLUMN")を削除し、私はラインを取得します。それは十分ではない場合: '悪い'コマンドを残すときsetkeyv(dt, "KEY_COLUMN")しかし、browser()の直後に行コマンドを挿入すると、すべてが正常に動作し、私は行を得る...

これは 'クオンタム'エラーです:あなたがエラーを見たいときはいつでも、それは消えます...あなたが本当にエラーを見ることができない状況でのみ、そこにあります。私は愚かな/ここで本当に簡単な何かを見落としているのでしょうか、何が起こっているのですか?

乾杯、

FW

+1

を、私はあなたが前の図面にデータをソートする必要があると思います。 'plot(c(1:5,2)、c(1:6)、type =" l ")'の結果を考えてみましょう。 – lmo

+0

しかし、xの次数は線については関係ありません:比較プロット(c(1,2,3)、2 * c(1,2,3)+5、タイプ= "l" 、3,2)、2 * c(1,3,2)+5、type = "l"):まったく同じように見える... –

+0

"完全に"同様に見えず、繰り返しそれ自身を引きます。私の賭けは、ローランドの理論があなたの現在の問題の原因となっていることです。 – lmo

答えて

2

ご存知のように、参照することによりdata.table修正。コードをすべて一度に入手すると、これを再現することができます。私がそれを1行ずつソースすると、私は期待される結果を得る。したがって、私は、これが起こると仮定:

linesの最初のパラメータはdata.tableのx列への参照であるxへの参照(ポインタ)です。決して変更されないので、実際にはコピーされず、参照のままです。行の2番目のパラメータは、式が評価され、新しい(独立した)変数になるため、参照ではありません。

プロットのCコードが実際にプロットを作成する前に、プロットが遅くなり、最後のコード行が評価されます(キーが設定されます)。これはメモリ内のdata.tableを注文し、xは依然としてその参照のみです。線は、並べ替えられたxデータに基づいて生成されます。

私がコピーを強制場合に予想される結果を得ることができます。

library(data.table) 

dt = data.table(KEY_COLUMN = c("a","c","d","e","b"), 
       x = c(29.34224, 26.77573, 25.45568, 26.27839, 28.22389) 
) 

x = copy(dt$x) 
#alternatively modifying x works: x[1] <- x[1] 

m = -0.1211562 
b = 63.09729 
plot(c(25,30), c(58,61)) 
lines(x, m*x + b, col="red") 
setkeyv(dt, "KEY_COLUMN") 

resulting plot

+0

パーフェクト!また、 'copy()'を呼び出すときに問題は発生しませんが、プロッティングがあらかじめ行われているので、並べ替えがどのようにプロットに影響を与えるかはわかりませんでした。あなたの説明はとても合理的に聞こえます。実際にプロットする前に入力をコピーする 'lines'という独自のバージョンを実装しています。 –

+0

@FabianWernerまた、data.table内のy値を計算し、dataメソッドで行の数式メソッドを使用することもできます。それから、xとyの両方が一緒に並べ替えられ、問題はないでしょう。 – Roland

関連する問題