Re: [問題] 用String設定數值陣列

看板Mathematica作者 (養花種魚數月亮賞星星)時間11年前 (2013/06/07 20:39), 編輯推噓2(205)
留言7則, 2人參與, 最新討論串1/1
※ 引述《TTLLIU (kerker)》之銘言: : Code: : hz = StringToStream[h1]; : h2 = ReadList[hz, Word]; : Close[hz]; : ToExpression[h2[[1]]]={1,2,3} : 簡單說明一下: : (1)h1本身是包含空格的String : (2)h2則把h1的每段String用空格為依據切成好幾個Word存成List : (3)第三步我則想要令h2中的Word為某個數值List : 前兩步都沒有問題,但是第三步會跳出錯誤訊息 : Set::write: Tag ToExpression in ToExpression[Energy] is Protected. : 這裡的Energy就是存在h2[[1]]中的字元。 : 目前看起來是lhs=rhs這個指令對lhs有所限制, : 不過總覺得我的思考方向可能有根本的錯誤......... : 不曉得有沒有高手可以指點一下呢?感恩。 Clear["Global`*"]; h1 = "ab bc cd"; data = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}; hz = StringToStream[h1]; h2 = ReadList[hz, Word]; MapThread[Set[Evaluate@ToExpression[#1], #2] &, {h2, data}]; ab bc cd -- 養花種魚數月亮賞星星 http://chungyuandye.twbbs.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.134.62

06/07 21:41, , 1F
解釋一下, 這是因為 Set (=) 具有 HoldFirst 屬性,
06/07 21:41, 1F

06/07 21:41, , 2F
所以第一個參數會保留原狀 (這通常是想要的, 例如 a = 3 時
06/07 21:41, 2F

06/07 21:42, , 3F
我們顯然不該去求 a 的值而是將 a 這變數設為 3
06/07 21:42, 3F

06/07 21:42, , 4F
但這裡這就造成了問題) Evaluate 就是強制求值的意思
06/07 21:42, 4F

06/07 21:43, , 5F
在被保留的參數上用 Evaluate 則被套用的東西就會強制算完
06/07 21:43, 5F

06/07 21:44, , 6F
所以能夠以此來達成動態設定變數的目的
06/07 21:44, 6F

06/07 22:13, , 7F
感謝兩位解釋 非常有用的資訊!!
06/07 22:13, 7F
文章代碼(AID): #1HiTICSi (Mathematica)
文章代碼(AID): #1HiTICSi (Mathematica)