eval parse 在我的函数中无法正常工作
eval parse is not working properly in my function
我有以下包含 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"
))
我有以下功能可以将标签和级别添加到现有数据集:
Add_Labels_Level_To_Dataset <- function(df, df_name,levels_list,labels_list) {
df[] <- lapply( df, ordered)
for (i in 1:length(colnames(df))) {
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
}
R 命令 运行:
Add_Labels_Level_To_Dataset(dt4, "dt4", level_list, labels_list)
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))
你能帮忙吗?
Using eval/parse should be avoided。在 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
}
我们可以这样称呼它
dt4 <- Add_Labels_Level_To_Dataset(dt4, level_list, label_list)
请注意,它 returns 是一个新的 data.frame,您可以将其重新分配给 dt4
或其他一些变量。 R 中的函数永远不应修改其自身范围之外的对象,这是您 运行 遇到函数问题的其他原因之一。
这是一个xy problem。我同意@MrFlick 的观点,应该避免解析。
在原来的 post 上,主要问题是函数应该返回 dt4
而不是 df
。定义 label_list.
时缺少一些 '
(单引号)
我们可以使用 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
我有以下包含 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"
))
我有以下功能可以将标签和级别添加到现有数据集:
Add_Labels_Level_To_Dataset <- function(df, df_name,levels_list,labels_list) {
df[] <- lapply( df, ordered)
for (i in 1:length(colnames(df))) {
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
}
R 命令 运行:
Add_Labels_Level_To_Dataset(dt4, "dt4", level_list, labels_list)
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))
你能帮忙吗?
Using eval/parse should be avoided。在 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
}
我们可以这样称呼它
dt4 <- Add_Labels_Level_To_Dataset(dt4, level_list, label_list)
请注意,它 returns 是一个新的 data.frame,您可以将其重新分配给 dt4
或其他一些变量。 R 中的函数永远不应修改其自身范围之外的对象,这是您 运行 遇到函数问题的其他原因之一。
这是一个xy problem。我同意@MrFlick 的观点,应该避免解析。
在原来的 post 上,主要问题是函数应该返回 dt4
而不是 df
。定义 label_list.
'
(单引号)
我们可以使用 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