PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
R_Language
Re: [問題] 檔名字串當成變數,get()有時成功有時失敗
作者:
LIAR
(玻璃做的大叔)
2021-08-21 22:18:10
: → 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都成功,但是要賦值時才出問題。
作者:
andrew43
(討厭有好心推文後刪文者)
2021-08-21 22:29:00
應該只是因為get不能賦值。有些function可以,例如colname,在手冊中會明確寫出來見 help(colnames) 中有 "colnames(x) <-"所以你應該改用assign才對。這比較像是R設計的方式
作者:
LIAR
(玻璃做的大叔)
2021-08-21 22:39:00
不過我是get後面接了$,是改變欄位內容,不是get本身,這樣也不行嗎?
作者:
locka
(locka)
2021-08-21 23:02:00
查了一下 看來原因是這個:you can't assign something tothe result of a function. 這篇有比較詳細的解釋
https://reurl.cc/ze3jnk
get(x)做的事情其實是把x複製了一份並return 所以對copy的x賦值是不合R語法的;跟有沒有用$指定欄位沒關係
作者:
LIAR
(玻璃做的大叔)
2021-08-21 23:55:00
assign對$的欄位,我測試失敗耶?跑出一個名稱超長變數:> `2020rib_selection version2_table$event_height[is...[1] "noData"這樣的結果。@locka: 不過我return後接$欄位有被承認,且我並非針對get的return去修改,這部分差異我還是搞不懂。
作者:
locka
(locka)
2021-08-22 00:10:00
是問為什麼 '…'$height[is.na(get(x)$…)] <- value 會成功嗎?這是因為你是對'…'$height[…]賦值,不是對get()回傳的東西賦值啊。get(…)回傳的東西就是複製的x
作者:
LIAR
(玻璃做的大叔)
2021-08-22 00:16:00
阿...第一個超長變數那個是要回應 @andrew43說的assign方式至於get()$[...]有成功,我一直認為是get把字串貼上後就沒事回家了,所以顯示沒問題。而賦值也是想說get()$到這邊已經
作者:
locka
(locka)
2021-08-22 00:20:00
andrew大說的assign可能要搭配迴圈的寫法才會得到你想要的結果
作者:
LIAR
(玻璃做的大叔)
2021-08-22 00:21:00
進入欄位階端,get()應該功成身退,賦值是針對$...動作,為什不行?如果這樣還不行,有沒有其他方法可以解決?
作者:
locka
(locka)
2021-08-22 00:24:00
get(x)是copy x --> get(x)$height等於是copy x的height,不是x的height
http://i.imgur.com/MWNU8ex.jpg
作者:
andrew43
(討厭有好心推文後刪文者)
2021-08-22 01:24:00
直接對list做assign也是copy。感謝提醒。建議此問題直接用簡單的list來操作例。現在實在不易看懂
繼續閱讀
[問題] 檔名字串當成變數,get()有時成功有時失敗
LIAR
[問題] rstudio當掉沒有回應
kylelin55
[問題] 直方圖標示資料次數問題? (ggplot)
askpeople
[問題]biblioshiny無法出現畫面
hhppp091043
[問題]急徵R語言解題家教
sacli
[問題] 用regex從檔名中拿出數字部分
luenchang
[問題] Rstudio 無法開啟
xx801114
[問題] 請問函數寫法?
askpeople
[問題] 林試所誠徵 碩士或學士級助理
Coaltit
Re: [問題] 安裝 OpenMP 與套件 stringi
MiddleRe
Links
booklink
Contact Us: admin [ a t ] ucptt.com