我正在嘗試使用一個函式,如果答案是一個小整數(10 或更小),那么它將給出數字的英文單詞(1 表示 1,2 表示 2 等),而數字表示更大的數字. 我遇到的問題是,在 ifelse 中使用english::english 時,它仍然給我數字。這是一個簡單的重復:
test_small <- 4
english::english(test_small)
ifelse(test_small < 11, english::english(test_small),test_small)
ifelse(test_small < 11, english::english(test_small),"fail")
在 ifelse 陳述句之外時,english::english(test_small) 會產生所需的“四”結果。不過,一旦我將它包裝在 ifelse 陳述句中,我就會得到“4”的結果。為了檢查我是否由于某種原因得到“錯誤結果”,我還做了第二個 ifelse 陳述句,它只會吐出“失敗”這個詞。但是不,我仍然得到“4”,而不是預期的“4”。
任何想法發生了什么?
uj5u.com熱心網友回復:
我不確定確切的問題,但一個簡單的解決方案是as.charachter()環繞english(test_small)
test_small <- 4
english::english(test_small)
ifelse(test_small < 11, as.character(english::english(test_small)), test_small)
ifelse(test_small < 11, as.character(english::english(test_small)), "fail")
uj5u.com熱心網友回復:
這是一個 S3 類物件問題。
首先english通過列印函式體來查看函式的定義。
library(english)
english
#function (x, ...)
#{
# UseMethod("english")
#}
#<bytecode: 0x55f20eecccc8>
#<environment: namespace:english>
所以函式是泛型的,看它的方法。
methods(english)
#[1] english.default* english.numeric*
#see '?methods' for accessing help and source code
有兩種方法,但只有類的方法"numeric"有用。這兩種方法都標有星號,因此它們不會從包命名空間中匯出。從help(methods").
如果方法定義不是從定義該方法的包命名空間匯出的,則 S3 方法名稱后跟一個星號 *。
獲取其來源的方法是使用getAnywhere.
getAnywhere("english.numeric")
#A single object matching ‘english.numeric’ was found
#It was found in the following places
# registered S3 method for english from namespace english
# namespace:english
#with value
#
#function (x, UK, ...)
#{
# if (missing(UK)) {
# UK <- getOption("english.UK", !grepl("^(en_us|english_united)",
# tolower(Sys.getlocale("LC_CTYPE"))))
# UK <- isTRUE(UK) || identical(UK, "UK")
# }
# else {
# UK <- as.logical(UK)[1]
# if (is.na(UK))
# stop("Bad specification of the UK flag. Must be logical scalar")
# }
# structure(x, class = "english", useUK = UK)
#}
<bytecode: 0x55f20ef091c8>
<environment: namespace:english>
>
該方法檢查語言環境并回傳具有新類屬性 class 的物件"english"。
所以這是一個列印方法神器。
getAnywhere("print.english")
#A single object matching ‘print.english’ was found
#It was found in the following places
# registered S3 method for print from namespace english
# namespace:english
#with value
#
#function (x, ...)
#{
# print(noquote(as.character.english(x)))
# invisible(x)
#}
#<bytecode: 0x55f20ef09750>
#<environment: namespace:english>
現在在as.character類物件的方法"english"中,數字變成了單詞。
ifelse(test_small < 11, as.character(english::english(test_small)), test_small)
#[1] "four" "five" "six"
ifelse(test_small < 11, as.character(english::english(test_small)), "fail")
#[1] "four" "five" "six"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/404922.html
標籤:
上一篇:如何標記x軸上的條形組?
下一篇:R中縮進的物料清單乘法
