如何使函数参数成为 R 中数据表的正确类型?

问题描述 投票:0回答:1

我有一个名为 data 的数据表:

[![这是数据表的屏幕截图][1]][1]

目标是编写一个模仿以下代码的函数:

data[Region == "Northeast",mean(Awareness, na.rm = TRUE), by = Product][order(-rank(V1))][1:5,.(Product)]

到目前为止我已经:

topx_engagement = function(state_of_engagement, respondent_variable, respondent_variable_sub, rank_length = 3){
  
  respondent_variable_sub = as.character(respondent_variable_sub)
  
  data[eval(respondent_variable == respondent_variable_sub), mean(get(state_of_engagement), na.rm = TRUE), by = Product][order(-rank(V1))][1:rank_length,.(Product)]
}

函数 topx_engagement 应允许用户输入与 Region 一致的 respondent_variable,与 “Northeast” 一致的 respondent_variable_sub 以及后续参数。我想重点关注前面的论点,因为所有其他论点都工作得很好。

目前,当我打电话时:

topx_engagement(state_of_engagement = Awareness, respondent_variable = Region, respondent_variable_sub = Northeast, rank_length = 3)

我收到错误:

topx_engagement 中的错误(state_of_engagement = 意识,respondent_variable = 区域,: 找不到对象“东北”

或者,跑步

topx_engagement = function(state_of_engagement, respondent_variable, respondent_variable_sub, rank_length = 3){
  
  #respondent_variable_sub = as.character(respondent_variable_sub)
  
  data[eval(respondent_variable == respondent_variable_sub), mean(get(state_of_engagement), na.rm = TRUE), by = Product][order(-rank(V1))][1:rank_length,.(Product)]
}

topx_engagement(state_of_engagement = Awareness, respondent_variable = Region, respondent_variable_sub = Northeast, rank_length = 3)

抛出错误 eval(.massagei(isub[[2L]]),parent.frame(),parent.frame()) 中的错误:找不到对象“Region”

我需要帮助以正确的格式获取函数输入。 [1]:https://i.sstatic.net/hseWS.png

r function input eval
1个回答
0
投票

如果我们传递不带引号的参数,我们可以使用

deparse/substitute
转换为
character
字符串

topx_engagement = function(state_of_engagement, 
     respondent_variable, respondent_variable_sub, rank_length = 3){
  
  state_of_engagement <- deparse(substitute(state_of_engagement))
  respondent_variable <- deparse(substitute(respondent_variable))
  respondent_variable_sub <- deparse(substitute(respondent_variable_sub))
 
 
  
  
  data[eval(as.name(respondent_variable)) == respondent_variable_sub, 
        mean(get(state_of_engagement), na.rm = TRUE), 
           by = Product][order(-rank(V1))][1:rank_length,.(Product)]
}

然后称其为

topx_engagement(state_of_engagement = Awareness, 
   respondent_variable = Region, 
       respondent_variable_sub = Northeast, rank_length = 3)
© www.soinside.com 2019 - 2024. All rights reserved.