Re: [問題] 檔名字串當成變數,get()有時成功有時失敗

看板R_Language作者 (玻璃做的大叔)時間3年前 (2021/08/21 22:18), 3年前編輯推噓7(7025)
留言32則, 3人參與, 3年前最新討論串2/2 (看更多)
: → locka: 請提供可重現錯誤的程式碼~ 08/21 11:47 : → locka: 是說我查get的說明,他是從命名空間(name space)中搜尋是否 08/21 11:53 : → locka: 有符合的物件,會不會是你選取檔案的程式碼並沒有在命名空 08/21 11:53 : → locka: 間中?另外get(x)的x要用字串形式,不知道你為什麼可以不用 08/21 11:53 : → locka: ?撇除這點,不知道是不是跟你賦值的動作有關?(總之沒提供 08/21 11:53 : → locka: 程式碼只能亂猜…坐等其他大大回覆 哈哈哈) 08/21 11:53 以下是全部的log,先清除所有變數空間。 檔名和表格都有成功存到變數空間。檔名變數也是字串沒問題。 > rm(list=ls(all.names = TRUE )) > raw_name <- choose.files(caption = "Select a raw excel file", multi = FALSE, filters = matrix(c("excel files", "*.xlsx", "CSV files", "*.csv"), ncol = 2, byrow = TRUE)) > tableName <- strsplit(basename(raw_name), ".", fixed = TRUE)[[1]][1] > library(magrittr) > tableName %<>% paste("table", sep = "_"); > library(openxlsx) > assign(tableName, read.xlsx(raw_name)); > get(tableName)$event_height[is.na(get(tableName)$event_height)] = "noData" Error in get(tableName)$event_height[is.na(get(tableName)$event_height)] = "noData" : could not find function "get<-" > is.na(get(tableName)$event_height) [1] FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE [18] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE [35] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE [52] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE get(tableName)是可以正常運作的。 > tableName [1] "2020rib_selection version2_table" 我get的tableName確實存在,所以我故意單獨呼叫這字串,貼回程式碼取代get的 段落,就可以執行了。 > `2020rib_selection version2_table`$event_height[is.na(get(tableName)$event_height)] = "noData" > is.na(get(tableName)$event_height) [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [35] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [52] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 取代成功,沒有NA,都變成"noData"的字串。 其實我在意那句could not find function "get<-",但上網查找不到, 而且邏輯上也不懂為什麼其他地方get都成功,但是要賦值時才出問題。 -- 起初,他們追殺共產主義者,我沒有說話,因為我不是共產主義者; 接著,他們追殺猶太人,我沒有說話,因為我不是猶太人; 後來,他們追殺工會成員,我沒有說話,因為我不是工會成員; 此後,他們追殺天主教徒,我沒有說話,因為我是新教教徒; 最後,他們奔我而來,卻再也沒有人站起來為我說話了。 《First They Came(他們首次來時)》,Martin Niemoller牧師(1892-1984) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.176.20.48 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1629555494.A.9E5.html ※ 編輯: LIAR (180.176.20.48 臺灣), 08/21/2021 22:21:38 ※ 編輯: LIAR (180.176.20.48 臺灣), 08/21/2021 22:22:47 ※ 編輯: LIAR (180.176.20.48 臺灣), 08/21/2021 22:23:20

08/21 22:29, 3年前 , 1F
應該只是因為get不能賦值。
08/21 22:29, 1F

08/21 22:31, 3年前 , 2F
有些function可以,例如colname,在手冊中會明確寫出來
08/21 22:31, 2F

08/21 22:31, 3年前 , 3F
見 help(colnames) 中有 "colnames(x) <-"
08/21 22:31, 3F

08/21 22:33, 3年前 , 4F
所以你應該改用assign才對。這比較像是R設計的方式
08/21 22:33, 4F

08/21 22:39, 3年前 , 5F
不過我是get後面接了$,是改變欄位內容,不是get本身,
08/21 22:39, 5F

08/21 22:39, 3年前 , 6F
這樣也不行嗎?
08/21 22:39, 6F

08/21 23:02, 3年前 , 7F
查了一下 看來原因是這個:you can't assign something to
08/21 23:02, 7F

08/21 23:02, 3年前 , 8F
the result of a function. 這篇有比較詳細的解釋
08/21 23:02, 8F

08/21 23:02, 3年前 , 9F
08/21 23:02, 9F

08/21 23:07, 3年前 , 10F
get(x)做的事情其實是把x複製了一份並return 所以對copy的x
08/21 23:07, 10F

08/21 23:07, 3年前 , 11F
賦值是不合R語法的;跟有沒有用$指定欄位沒關係
08/21 23:07, 11F

08/21 23:55, 3年前 , 12F
assign對$的欄位,我測試失敗耶?跑出一個名稱超長變數:
08/21 23:55, 12F

08/21 23:56, 3年前 , 13F
> `2020rib_selection version2_table$event_height[is...
08/21 23:56, 13F

08/21 23:56, 3年前 , 14F
[1] "noData"
08/21 23:56, 14F

08/21 23:57, 3年前 , 15F
這樣的結果。
08/21 23:57, 15F

08/21 23:59, 3年前 , 16F
@locka: 不過我return後接$欄位有被承認,且我並非針對get的
08/21 23:59, 16F

08/22 00:00, 3年前 , 17F
return去修改,這部分差異我還是搞不懂。
08/22 00:00, 17F
※ 編輯: LIAR (180.176.20.48 臺灣), 08/22/2021 00:03:08

08/22 00:10, 3年前 , 18F
是問為什麼 '…'$height[is.na(get(x)$…)] <- value 會成
08/22 00:10, 18F

08/22 00:10, 3年前 , 19F
功嗎?這是因為你是對'…'$height[…]賦值,不是對get()回
08/22 00:10, 19F

08/22 00:10, 3年前 , 20F
傳的東西賦值啊。get(…)回傳的東西就是複製的x
08/22 00:10, 20F

08/22 00:16, 3年前 , 21F
阿...第一個超長變數那個是要回應 @andrew43說的assign方式
08/22 00:16, 21F

08/22 00:18, 3年前 , 22F
至於get()$[...]有成功,我一直認為是get把字串貼上後就沒事
08/22 00:18, 22F

08/22 00:20, 3年前 , 23F
回家了,所以顯示沒問題。而賦值也是想說get()$到這邊已經
08/22 00:20, 23F

08/22 00:20, 3年前 , 24F
andrew大說的assign可能要搭配迴圈的寫法才會得到你想要的
08/22 00:20, 24F

08/22 00:20, 3年前 , 25F
結果
08/22 00:20, 25F

08/22 00:21, 3年前 , 26F
進入欄位階端,get()應該功成身退,賦值是針對$...動作,
08/22 00:21, 26F

08/22 00:22, 3年前 , 27F
為什不行?如果這樣還不行,有沒有其他方法可以解決?
08/22 00:22, 27F

08/22 00:24, 3年前 , 28F
get(x)是copy x --> get(x)$height等於是copy x的height,
08/22 00:24, 28F

08/22 00:24, 3年前 , 29F
不是x的height
08/22 00:24, 29F

08/22 00:37, 3年前 , 30F

08/22 01:24, 3年前 , 31F
直接對list做assign也是copy。感謝提醒。
08/22 01:24, 31F

08/22 01:27, 3年前 , 32F
建議此問題直接用簡單的list來操作例。現在實在不易看懂
08/22 01:27, 32F
文章代碼(AID): #1X8Gicdb (R_Language)
文章代碼(AID): #1X8Gicdb (R_Language)