R使用textInput()读取多个数字

R使用textInput()读取多个数字,r,shiny,shinydashboard,R,Shiny,Shinydashboard,我想通过textInput从仪表板用户那里读取以逗号分隔的多个年份,并能够输入一系列数字,例如1910、1980:1990、2017。然后,我需要遍历列表中的每一年,并将它们从数据表中删除 我的函数如下所示,其中daily_mean_Q是一个数据帧,excluded_years是用户提供的一个数组c1910,1980:1990,2017 remove_years <- function(daily_mean_Q, excluded_years) { daily_mean_Q <

我想通过textInput从仪表板用户那里读取以逗号分隔的多个年份,并能够输入一系列数字,例如1910、1980:1990、2017。然后,我需要遍历列表中的每一年,并将它们从数据表中删除

我的函数如下所示,其中daily_mean_Q是一个数据帧,excluded_years是用户提供的一个数组c1910,1980:1990,2017

remove_years <- function(daily_mean_Q, excluded_years) {

  daily_mean_Q <- daily_mean_Q %>%
    mutate(Year = str_sub(Date, 1, 4))
  for(year in excluded_years) {
    daily_mean_Q <- daily_mean_Q %>%
      filter(Year != as.character(year))
  }

  daily_mean_Q <- daily_mean_Q %>%
    select(-Year)
}
编辑:我被你的例子迷住了:你应该用%in%而不是=

虽然没有这些数据,我不能说太多,但我认为应该去掉for循环

日平均值 滤器年份%(以%as.characterexcluded\u年为单位) 筛选器可以筛选出多个值。参见示例

图书馆管理员 图书馆弹琴 gapminder%>% 滤器1952年%c1952年%C1957年 >A tibble:1420 x 6 >国家大陆年寿命Exp pop gdpPercap > >1阿富汗亚洲1962 32.0 10267083 853。 >2阿富汗亚洲1967 34.0 11537966 836。 >3阿富汗亚洲1972 36.1 13079460 740。 >4阿富汗亚洲1977 38.4 14880372 786。 >5阿富汗亚洲1982 39.9 128816 978。 >6阿富汗亚洲1987 40.8 13867957 852。 >7阿富汗亚洲1992 41.7 16317921 649。 >8阿富汗亚洲1997 41.8 2227415 635。 >9阿富汗亚洲2002 42.1 25268405 727。 >10阿富汗亚洲2007 43.8 31889923 975。 > ... 还有1410行
这实际上是的重复,因为您正在尝试对集合成员资格操作使用相等,即使您尚未尝试%中的%。除非我完全误解了你的问题

向量vec1和vec2在R中的基本相等性在以下几个方面起作用:

如果vec2或vec1的长度为1,则将每个vec1与之进行比较,如vec1[1]==vec2[1],vec1[2]==vec2,如中所示

1:10 == 3 [1] 假假假假假假假假假假假假假假假 如果lengthvec1==lengthvec2,则我们将进行元素级比较:

1:10==c1,2,3,99,99,6,7,99,99,99,99 [1] 真假真假真假假假假 若lengthvec1 length是lengthvec2的偶数倍,那个么R会自动循环,这就是混乱和问题发生的地方。这意味着

1:10==c3,2 [1] 假真假假假假假假假假假假假假 这是有效的 1:10==c3,2,3,2,3,2,3,2,3,2 [1] 假真假假假假假假假假假假假假 到目前为止,这似乎是正确的,这是偶然的。最后,当我们输入1:10==c2,3时,我们最终会说1,3,5。。。vec1的元素是2,第二、第四、第六。。。vec1的元素是3。通常情况下,这不是我们想要的,通常是指集合成员资格。如果它是集合成员,那么我们会认为在vec2中反转数字不会有任何效果。。。但事实并非如此

1:10==c2,3 [1] 假假假假假假假假假假假假假假假 这是有效的 1:10==c2,3,2,3,2,3,2,3,2,3 [1] 假假假假假假假假假假假假假假假 如果lengthvec1不是lengthvec2的偶数倍,则仍会出现接近上述值的情况,但至少我们会看到一条警告:

1:10==c3,2,1 警告1:10==c3,2,1: 较长的对象长度不是较短对象长度的倍数 [1] 假真假假假假假假假假假假假假假 这是有效的 1:10==c3,2,1,3,2,1,3,2,1,3不均匀循环 [1] 假真假假假假假假假假假假假假假 要总结vector==操作,它是有意且安全的!比较相同长度的向量或其中一个向量为长度1时的向量。虽然任何其他条件都可能不会发出警告或出错,但结果往往不是预期的结果

当您想知道vec1中的哪一个包含在vec2中时,我们需要%in%运算符:

%c2中的1:10%,3 [1] 假真假假假假假假假假假假假假 vec2中的顺序并不重要 %c3中的1:10%,2 [1] 假真假假假假假假假假假假假假 这实际上是说,对于vec1中的每个元素,元素==对于vec2中的任何元素,这实际上是我们上面的第一个项目符号:元素的长度为1,vec2的长度为1或更多。错误的伪代码循环证明了这一点:

for (el in vec1)       # el is length 1
  if (any(el == vec2)) # this works as intended per bullet 1 above
  then true
  else false
done
如果你的年数真的是一个整数向量,如


排除这些年,每天使用过滤器会更好!%excluded_years.BTW中的年份%in,str_subDate,1,4违反了函数的作用域,日期既不是在函数中创建的,也不是作为参数传递给它的。如果在父环境或更高的环境中定义了日期,则不会抱怨找不到对象“Date”,但依赖该行为通常是不好的做法,并且会导致函数不可复制
这意味着它的输出不是由输入单独定义的。要了解%in%如何更好,我认为在这里,请参阅和@r2evans For your second comment Date是daily_mean_Q数据框中的一个列名,而不是一个全局变量。我不知道%in%运算符,但会将其合并到我的代码中。谢谢xyz!=c1952、1957仅在xyz为长度2时正确。即使如此,我仍然认为这可能不是一个好主意。为了说明为什么这在这里可能有效,但在结构上是错误的,请尝试filteryear!=C19571952反向值,请查看您得到的是不同的返回值。感谢您的深入解释!最后两个代码示例回答了我的问题,即如何将1957、1960:1970、1987转换为c1957、1960:1970、1987