eval parse在我的函数中工作不正常

eval parse在我的函数中工作不正常,r,function,labels,levels,R,Function,Labels,Levels,我有以下数据集,其中包括2个变量: dt4<-structure(list(a1 = c(4L, 4L, 3L, 4L, 4L), a2 = c(1L, 3L, 4L, 5L, 4L)), .Names = c("a1", "a2" ), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame" )) R命令中提供的列表如下,分别表示数据集中每个变量的有序级别: label_list=list("'S','SA','

我有以下数据集,其中包括2个变量:

dt4<-structure(list(a1 = c(4L, 4L, 3L, 4L, 4L), a2 = c(1L, 
3L, 4L, 5L, 4L)), .Names = c("a1", "a2"
), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))
R命令中提供的列表如下,分别表示数据集中每个变量的有序级别:

label_list=list("'S','SA','SB','SC,'SD'", "'S','SA','SB','SC,'SD'")
level_list=list("5,4,3,2,1", "5,4,3,2,1")
为什么我的功能不能正常工作? 我不知道那是怎么回事! 当我在R函数外运行R命令时,它们将级别/标签绑定到给定的数据集。然而,当我运行我的R函数时,这并没有发生

  df_name="dt4"
  df=dt4
  levels_list=level_list
  labels_list=label_list
  i=3

  df[] <- lapply( df, ordered)
          arg0<-paste0(df_name,"[i]", "<-ordered(", df_name, "$'", colnames(df)[i], "', levels=c(", levels_list[[i]], "), labels = c(", labels_list[[i]],"))"  )
                eval(parse(text=arg0))
df_name=“dt4”
df=dt4
级别列表=级别列表
标签列表=标签列表
i=3
df[]。在R中,有许多简单得多的方法来做您想要做的事情。例如,有了这些代码,我们就可以编写

Add_Labels_Level_To_Dataset <- function(df, levels_list, labels_list)   {
  df[] <- Map(function(data, levels, labels) {
     ordered(data, levels=strsplit(levels,",")[[1]], labels=strsplit(labels, ",")[[1]])
  }, df, levels_list, labels_list)
  df
}
将\u标签\u级别\u添加到\u数据集。在R中,有许多简单得多的方法来做您想要做的事情。例如,有了这些代码,我们就可以编写

Add_Labels_Level_To_Dataset <- function(df, levels_list, labels_list)   {
  df[] <- Map(function(data, levels, labels) {
     ordered(data, levels=strsplit(levels,",")[[1]], labels=strsplit(labels, ",")[[1]])
  }, df, levels_list, labels_list)
  df
}
Add_Labels_Level_To_Dataset这是一个。我同意@MrFlick的观点,应该避免解析。
在最初的帖子中,主要问题是函数应该返回
dt4
,而不是
df
。定义标签列表时缺少一些
(单引号)

我们可以使用
mapply
并避免单一报价:

label_list=list(c('S','SA','SB','SC','SD'), c('S','SA','SB','SC','SD'))
level_list=list(c(5,4,3,2,1), c(5,4,3,2,1))

as.data.frame(mapply(function(x, labels,levels ) {ordered(x, labels,levels)}, dt4, level_list, label_list, SIMPLIFY = F))
#  a1 a2
#1 SA SD
#2 SA SB
#3 SB SA
#4 SA  S
#5 SA SA
这是一个很好的例子。我同意@MrFlick的观点,应该避免解析。 在最初的帖子中,主要问题是函数应该返回
dt4
,而不是
df
。定义标签列表时缺少一些
(单引号)

我们可以使用
mapply
并避免单一报价:

label_list=list(c('S','SA','SB','SC','SD'), c('S','SA','SB','SC','SD'))
level_list=list(c(5,4,3,2,1), c(5,4,3,2,1))

as.data.frame(mapply(function(x, labels,levels ) {ordered(x, labels,levels)}, dt4, level_list, label_list, SIMPLIFY = F))
#  a1 a2
#1 SA SD
#2 SA SB
#3 SB SA
#4 SA  S
#5 SA SA

我认为你的回答更优雅/有效/简短。然而,为什么str()命令会显示factors而不是ord.factors当我应用你的R命令时,它会显示ord.factors@Marcelo?@Elias我已经更新了答案。将
SIMPLIFY=F
添加到
mapply
将保留有序因子类。我认为您的回答更优雅/高效/简短。然而,为什么str()命令会显示factors而不是ord.factors当我应用你的R命令时,它会显示ord.factors@Marcelo?@Elias我已经更新了答案。将
SIMPLIFY=F
添加到
mapply
将保留有序因子类。
label_list=list(c('S','SA','SB','SC','SD'), c('S','SA','SB','SC','SD'))
level_list=list(c(5,4,3,2,1), c(5,4,3,2,1))

as.data.frame(mapply(function(x, labels,levels ) {ordered(x, labels,levels)}, dt4, level_list, label_list, SIMPLIFY = F))
#  a1 a2
#1 SA SD
#2 SA SB
#3 SB SA
#4 SA  S
#5 SA SA