質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

Q&A

解決済

1回答

185閲覧

[julia] 参照元のデータフレームの値が変わってしまう問題

akirayoshimura

総合スコア46

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

1グッド

0クリップ

投稿2023/06/02 03:59

Juliaでデータフレームを参照する関数を使用した際に参照元のデータフレームの値が変わってしまいます。変わらないで参照する方法はありますか?

julia

1↓これだとaの値が変わる 2a = Dataframe(a=[1,2,3], b = [3,4,5]) 3function add(df) 4 df[c] = fill(NaN, size(df, 1)) 5 for row in eachrow(df) 6 row.c = a * b 7 end 8 return df 9end 10 11↓これでもaの値が変わる 12a = Dataframe(a=[1,2,3], b = [3,4,5]) 13function add(oldDF) 14 df = oldDF 15 df[c] = fill(NaN, size(df, 1)) 16 for row in eachrow(df) 17 row.c = a * b 18 end 19 return df 20end 21 22↓これでもaの値が変わる 23a = Dataframe(a=[1,2,3], b = [3,4,5]) 24function add(oldDF) 25 df = oldDF[:, :] 26 df[c] = fill(NaN, size(df, 1)) 27 for row in eachrow(df) 28 row.c = a * b 29 end 30 return df 31end
melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Argument Passing Behavior - Functions · The Julia Language

Julia function arguments follow a convention sometimes called "pass-by-sharing", which means that values are not copied when they are passed to functions. Function arguments themselves act as new variable bindings (new "names" that can refer to values), much like assignments argument_name = argument_value, so that the objects they refer to are identical to the passed values. Modifications to mutable values (such as Arrays) made within a function will be visible to the caller. (This is the same behavior found in Scheme, most Lisps, Python, Ruby and Perl, among other dynamic languages.)

なので、データフレームを deep copy します。

julia

1using DataFrames 2 3a = DataFrame(a=[1,2,3], b = [3,4,5]) 4function add(df) 5 df = deepcopy(df) 6 df[!, "c"] = fill(NaN, size(df, 1)) 7 for row in eachrow(df) 8 row.c = row.a * row.b 9 end 10 return df 11end 12 13println(add(a)) 14println(a) 15 16# 3×3 DataFrame 17# Row │ a b c 18# │ Int64 Int64 Float64 19# ─────┼─────────────────────── 20# 1 │ 1 3 3.0 21# 2 │ 2 4 8.0 22# 3 │ 3 5 15.0 23# 24# 3×2 DataFrame 25# Row │ a b 26# │ Int64 Int64 27# ─────┼────────────── 28# 1 │ 1 3 29# 2 │ 2 4 30# 3 │ 3 5

投稿2023/06/02 04:22

編集2023/06/02 04:24
melian

総合スコア19849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akirayoshimura

2023/06/02 06:20

melianさん回答ありがとうございます! 解決出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問