Вот начало, которое должно довести вас до сотен тысяч.
word2num <- function(word){
wsplit <- strsplit(tolower(word)," ")[[1]]
one_digits <- list(zero=0, one=1, two=2, three=3, four=4, five=5,
six=6, seven=7, eight=8, nine=9)
teens <- list(eleven=11, twelve=12, thirteen=13, fourteen=14, fifteen=15,
sixteen=16, seventeen=17, eighteen=18, nineteen=19)
ten_digits <- list(ten=10, twenty=20, thirty=30, forty=40, fifty=50,
sixty=60, seventy=70, eighty=80, ninety=90)
doubles <- c(teens,ten_digits)
out <- 0
i <- 1
while(i <= length(wsplit)){
j <- 1
if(i==1 && wsplit[i]=="hundred")
temp <- 100
else if(i==1 && wsplit[i]=="thousand")
temp <- 1000
else if(wsplit[i] %in% names(one_digits))
temp <- as.numeric(one_digits[wsplit[i]])
else if(wsplit[i] %in% names(teens))
temp <- as.numeric(teens[wsplit[i]])
else if(wsplit[i] %in% names(ten_digits))
temp <- (as.numeric(ten_digits[wsplit[i]]))
if(i < length(wsplit) && wsplit[i+1]=="hundred"){
if(i>1 && wsplit[i-1] %in% c("hundred","thousand"))
out <- out + 100*temp
else
out <- 100*(out + temp)
j <- 2
}
else if(i < length(wsplit) && wsplit[i+1]=="thousand"){
if(i>1 && wsplit[i-1] %in% c("hundred","thousand"))
out <- out + 1000*temp
else
out <- 1000*(out + temp)
j <- 2
}
else if(i < length(wsplit) && wsplit[i+1] %in% names(doubles)){
temp <- temp*100
out <- out + temp
}
else{
out <- out + temp
}
i <- i + j
}
return(list(word,out))
}
Результаты:
> word2num("fifty seven")
[[1]]
[1] "fifty seven"
[[2]]
[1] 57
> word2num("four fifty seven")
[[1]]
[1] "four fifty seven"
[[2]]
[1] 457
> word2num("six thousand four fifty seven")
[[1]]
[1] "six thousand four fifty seven"
[[2]]
[1] 6457
> word2num("forty six thousand four fifty seven")
[[1]]
[1] "forty six thousand four fifty seven"
[[2]]
[1] 46457
> word2num("forty six thousand four hundred fifty seven")
[[1]]
[1] "forty six thousand four hundred fifty seven"
[[2]]
[1] 46457
> word2num("three forty six thousand four hundred fifty seven")
[[1]]
[1] "three forty six thousand four hundred fifty seven"
[[2]]
[1] 346457
Я уже могу сказать вам, что это не сработает для word2num("four hundred thousand fifty")
, поскольку он не знает, как обрабатывать последовательные «сотни» и «тысячи» терминов, но алгоритм может быть модифицирован, вероятно. Любой человек должен отредактировать это, если у него есть улучшения или они будут построены на их собственном ответе. Я просто подумал, что это была забавная проблема для игры (на некоторое время).
Edit: Очевидно, у Билла Вейблса есть пакет под названием english , который может достичь этого даже лучше, чем выше кода.
Оператор if останавливается, как только он встречает действительный оператор.
Не нужно, если здесь, вы можете просто вставить входные значения вместе:
library(shiny)
server <- shinyServer( function(input, output) {
output$whatever<-renderText( {
vals <- paste(input$test, collapse = " ")
paste("Your ideal(s) value(s) are", vals)
}
)
}
)
ui <- shinyUI(fluidPage(
headerPanel(title="pratice"),
sidebarLayout(
sidebarPanel(
selectInput("test",label="Test",multiple = TRUE,
choices=list("a","b","c","d"),
)),
mainPanel(
textOutput("whatever")
)
)
)
)
shinyApp(ui, server)
вы можете использовать:
selectizeInput(inputId, label, choices, selected = NULL, multiple = FALSE,
options = NULL) ## and switch multiple to True