R 分析多变量函数中的变量时出错

R 分析多变量函数中的变量时出错,r,R,我在var上出错您的代码有一些地方出错。部分问题可能是您的代码很难调试,因为您的间距和缩进使您很难看到发生了什么。这不是风格或品味的次要问题;老实说,这会影响到编写和维护代码的容易程度 实际导致错误的问题是,您的第一个函数调用了rlang::parse_expr(var),但var不是字符串,而是数据中的一整列。当您调用tab\u 1d(tab,tab[i],var\u name\u list[i],Suff)时,您正在传递tab[i],这是数据框中的一整列。您可能想通过var\u list[i

我在var上出错您的代码有一些地方出错。部分问题可能是您的代码很难调试,因为您的间距和缩进使您很难看到发生了什么。这不是风格或品味的次要问题;老实说,这会影响到编写和维护代码的容易程度

实际导致错误的问题是,您的第一个函数调用了
rlang::parse_expr(var)
,但
var
不是字符串,而是数据中的一整列。当您调用
tab\u 1d(tab,tab[i],var\u name\u list[i],Suff)
时,您正在传递
tab[i]
,这是数据框中的一整列。您可能想通过
var\u list[i]

另一个大问题是函数包含的参数。您的第一个函数包含两个在函数中实际未使用的参数:
Name\u of_variable
Suff
。更糟糕的是,当你打电话的时候
tab\u 1d(tab,tab[i],var\u name\u list[i],Suff)
,您正在将
Suff
作为未命名变量传递,而
tab\u 1d
因此认为您正在将字符串
Suff
传递给
decimal
,因此无法正确解释它

在用函数式语言(如R)编写代码时,最好识别代码中的重复模式,看看是否可以创建一个防止代码重复的函数。这使我们更容易看到发生了什么。例如,您可以通过首先定义一个小的格式化函数来简化第一个函数,该函数允许您更轻松地指定格式:

格式\u分位数%
四舍五入(numdig)%>%
格式(nsmall=numdig)
}
现在,您的主要功能可以如下所示:

tab_1d%
总结(q25=格式+分位数(!!var,分位数=0.25,numdig=numdig),
中位数=格式\分位数(!!var,分位数=0.5,numdig=numdig),
平均值=格式(四舍五入(平均值(!!var,na.rm=TRUE),位数=numdig)),
q75=分位数格式(!!var,分位数=0.75,numdig=numdig),
N=总和(!is.na(!!var)))
}
您还可以使用
lappy
,简化使用循环创建列表的函数:


tab_value_1d_row谢谢你的建议,我也尝试过像tab_1d(tab,name(tab[i])、var_name_list[i],Suff这样的方法,它的工作原理也是这样的
dataa<-data.frame(
  aa = c("q","r","y","v","g","y","d","s","n","k","y","d","s","t","n","u","l","h","x","c","q","r","y","v","g","y","d","s","n","k","y","d","s","t","n","u","l","h","x","c"),
  col1=c(1,2,3,2,1,2,3,4,4,4,5,3,4,2,1,2,5,3,2,1,2,4,2,1,3,2,1,2,3,1,2,2,4,4,4,1,2,5,3,5),
  col2=c(250,1100,100,750,400,100,200,700,500,700,200,600,200,200,600,300,400,300,200,500,700,500,600,400,400,600,500,600,400,100,700,300,200,700,700,200,300,700,200,400),
  col3= c(2150,3213,2580,4335,2228,3795,2319,2363,2252,3015,2978,2127,3938,3013,3063,4202,4340,4247,3755,4145,3300,3739,3294,2944,4152,2898,2500,3164,2384,2824,3431,2864,3752,2265,3332,3321,3418,3521,2689,2186)
)