首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我使用的字符串去掉了太多的字符?

为什么我使用的字符串去掉了太多的字符?
EN

Stack Overflow用户
提问于 2022-08-03 12:22:13
回答 2查看 37关注 0票数 1

在运行下面的演示代码时,用户从顶部菜单中拖放元素到下面的部分,以构建一个dataframe。第一个dataframe (输出名choices)在运行代码时出现在面板的右上角,呈现良好。因此,例如,如果我按该顺序拖动元素Iron/Iron/Neon/Iron,choices将正确呈现如下所示:

代码语言:javascript
复制
     choice decayCode
1 1. Iron A         1
2 2. Iron B         1
3 3. Neon A         1
4 4. Iron C         1

但是,第二个DF choices2呈现错误,如下所示(choices2 DF只是上面choices DF的镜像,但去掉了下面解释的几个字符):

代码语言:javascript
复制
  choice decayCode
1      A         1
2      B         1
3      A         1
4      C         1

我希望choices2 DF以如下方式呈现,去掉了数字前缀".“和choices DF上面呈现的”选择“列的每一行中的空格,同时保留每个元素的名称,后面跟着它的顺序字母后缀:

代码语言:javascript
复制
  choice decayCode
1 Iron A         1
2 Iron B         1
3 Neon A         1
4 Iron C         1

我在使用该行中的字符串包使用字符剥离代码时肯定做错了什么:dat %>% mutate(choice=stringr::str_sub(choice, -1)),在这里,我尝试去掉每个列出元素的数字/“.”/space前缀。我在这里做错什么了?

我对R基中的字符剥离持开放态度;如果可能的话,我更喜欢基R,因为我正在努力学习。

演示代码:

代码语言:javascript
复制
library(dplyr)
library(jsTreeR)
library(shiny)
library(stringr)

nodes <- list(
  list(
    text = "Pick elements from this list:",
    state = list(opened = TRUE),
    children = list(
      list(text = "Iron",type = "moveable"),
      list(text = "Neon",type = "moveable")
    )
  ),
  list(
    text = "Drag here to build DF:",
    type = "target",
    state = list(opened = TRUE)
  )
)

dnd <- list(
  always_copy = TRUE,
  inside_pos = "last", 
  is_draggable = JS(
    "function(node) {",
    "  return node[0].type === 'moveable';",
    "}"
  )
)

mytree <- jstree(
  nodes, 
  dragAndDrop = TRUE, dnd = dnd, 
  checkCallback = checkCallback,
  contextMenu = list(items = customMenu),
  types = list(moveable = list(), target = list())
)

script <- '
$(document).ready(function(){
  var LETTERS = ["A", "B", "C", "D"];
  var Visited = {};
  $("#mytree").on("copy_node.jstree", function(e, data){
    var oldid = data.original.id;
    var visited = Object.keys(Visited);
    if(visited.indexOf(oldid) === -1){
      Visited[oldid] = 0;
    }else{
      Visited[oldid]++;
    }
    var letter = LETTERS[Visited[oldid]];
    var node = data.node;
    var id = node.id;
    var index = $("#"+id).index() + 1;
    var text = index + ". " + node.text + " " + letter;
    Shiny.setInputValue("choice", text);
    var instance = data.new_instance;
    instance.rename_node(node, text);
  });
});
'

ui <- fluidPage(
  tags$div(class = "header", checked = NA,tags$p(tags$script(HTML(script)))),
  fluidRow(
    column(width = 4,jstreeOutput("mytree")),
    column(width = 8,fluidRow(verbatimTextOutput("choices"),verbatimTextOutput("choices2")))
  )
)

server <- function(input, output, session){
  output[["mytree"]] <- renderJstree(mytree)
  
  Choices <- reactiveVal(data.frame(choice = character(0), decayCode = numeric(0)))
  
  observeEvent(input[["choice"]], {Choices(rbind(Choices(), data.frame(choice = input[["choice"]], decayCode = 1)))} )

  output[["choices"]] <- renderPrint({Choices()})
  
  output[["choices2"]] <- renderPrint({
    dat <- Choices()[rep(row.names(Choices()), Choices()[,2]), 1:2]
    ifelse(nrow(dat) == 0, dat, row.names(dat) <- seq(1:nrow(dat)))
    dat <- dat %>% mutate(choice=stringr::str_sub(choice, -1))
    dat
  })

}

shinyApp(ui=ui, server=server)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-03 14:33:22

另一个更普遍的解决方案是使用正则表达式。我认为使用正则表达式可能是一个更好的主意,例如,您可以包括想要删除多个数字的数字的情况。在我使用的正则表达式中,^表示字符串的开头,[0-9]+,表示一个或多个数字,\\.,代表一个点,以及一个空格。然后,gsub只需删除与该模式匹配的字符。

代码语言:javascript
复制
library(dplyr)

df |>
  mutate(new = gsub("^[0-9]+\\. ", "", choice))

#     choice decayCode    new
#1 1. Iron A         1 Iron A
#2 2. Iron B         1 Iron B
#3 3. Neon A         1 Neon A
#4 4. Iron C         1 Iron C
票数 1
EN

Stack Overflow用户

发布于 2022-08-03 12:29:13

str_sub()中,负的startstop值“从最后一个字符开始向后计数”-因此,对于start = -1,您将从最后一个字符开始提取子字符串。

若要从开始时删除固定数目的字符,请使用一个正的start值:

代码语言:javascript
复制
stringr::str_sub("1. Iron A", 4)
#> [1] "Iron A"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73221652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档