R语言中的函数20:assign(), parse(),eval()和do.call()

assign()函数的用法

assign(x, value, envir = as.environment(-1))
  • x:一个字符字符串,表示要创建或修改的变量名。
  • value:要赋给变量的值。
  • envir:指定环境,默认为当前环境(as.environment(-1))。可以指定其他环境,例如全局环境或特定的列表。

实例

# 使用 assign() 创建一个变量  
assign("my_variable", 42)  

# 检查变量的值  
print(my_variable)  # 输出 42

parse()函数的用法

parse()可以把字符串解析为R语言的代码。函数形式如下:

parse(file = "", n = NULL, text = NULL, prompt = "?",
      keep.source = getOption("keep.source"), srcfile,
      encoding = "unknown")
  • file:是字符串所在的文件或者URL
  • text: 接受一个带解析的字符串
    这两个参数使用其中一个就可以了

实例

 > parse(text='2+3')
# expression(2+3)
> parse(text='a<-10')
# expression(a<-10)

eval()函数的用法

此函数可以接受一个expression对象作为参数,并把此对象当做R代码去执行。用法如下:

eval(expr, envir = parent.frame(),
           enclos = if(is.list(envir) || is.pairlist(envir))
                       parent.frame() else baseenv())

实例:

> eval(parse(text='2+3'))
# [1] 5
> eval(parse(text='a<-10'))
> a
# [1] 10

do.call()函数的用法

do.call 构造并执行 来自字符串名称或直接函数调用来的函数, 并将其传递给它的参数列表 > 参数列表 即 list, 所以 do.call 针对的就是 list。

do.call(what, args, quote = FALSE, envir = parent.frame()) 

参数:

  • what
    可以是一个函数也可以是一个 字符串形式的函数名称(eg. kmeans or ‘kmeans’).
  • args
    供函数调用的参数设置,这些参数都将被 what 识别并调用.
  • quote 逻辑值, 是否引用参数.
  • envir 评估函数调用时所处的环境. 对于what是字符串形式函数名称且对应的参数都是符号或者引用的表达式时会非常有用.

实例

do.call(rbind,list(a1=c(1,2,3),b1=c(4,5,6),c1=c(7,8,9)))
[,1] [,2] [,3]
a1 1 2 3
b1 4 5 6
c1 7 8 9

t1=do.call('kmeans',list(x=iris[,1:4],centers=3))
t1$cluster
[1] 1 3 3 3 1 1 1 1 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 3 1 1 1 3 1 1 3 3 1
[45] 1 3 1 3 1 1 2 2 2 2 2 2 2 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[89] 2 2 2 2 2 3 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[133] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

可以参考:
https://amjiuzi.github.io/2017/09/30/do_call/

实现对多个数据框的合并

先把所有数据{x1,x2,…,x100}并到一个list

data <- lapply(paste0("x", 1:100), function(x) eval(as.name(x)))
do.call("rbind", data)

同时读取多个数据库并合并

data <- lapply(1:10, function(x) read.csv(paste0(x,".csv")))
do.call("rbind", data)
import random import string import ast import astor import base64 import zlib from cryptography.fernet import Fernet class CodeObfuscator: def __init__(self): self.var_mapping = {} self.func_mapping = {} self.class_mapping = {} self.string_mapping = {} self.key = Fernet.generate_key() self.cipher = Fernet(self.key) def random_name(self, length=12): """生成随机标识符名""" return ''.join(random.choices(string.ascii_letters, k=length)) def encrypt_string(self, s): """加密字符串并返回Base64编码""" encrypted = self.cipher.encrypt(s.encode()) return base64.b64encode(encrypted).decode() def generate_dummy_code(self): """生成无意义的代码片段""" dummies = [ "for _ in range(random.randint(1, 10)): pass", "if False: print('Never executed')", "[x for x in range(100) if x % 2 == 0]", "__import__('os').system('echo harmless')" ] return ast.parse(random.choice(dummies)).body def visit_Assign(self, node): """处理赋值语句""" # 重命名左侧变量 for target in node.targets: if isinstance(target, ast.Name): if target.id not in self.var_mapping: self.var_mapping[target.id] = self.random_name() target.id = self.var_mapping[target.id] return node def visit_FunctionDef(self, node): """处理函数定义""" # 重命名函数 if node.name not in self.func_mapping: self.func_mapping[node.name] = self.random_name() node.name = self.func_mapping[node.name] # 重命名参数 for arg in node.args.args: if arg.arg not in self.var_mapping: self.var_mapping[arg.arg] = self.random_name() arg.arg = self.var_mapping[arg.arg] # 添加虚假代码 if random.random() > 0.3: # 70%概率添加虚假代码 node.body = self.generate_dummy_code() + node.body return node def visit_ClassDef(self, node): """处理类定义""" # 重命名类 if node.name not in self.class_mapping: self.class_mapping[node.name] = self.random_name() node.name = self.class_mapping[node.name] # 重命名类方法 for item in node.body: if isinstance(item, ast.FunctionDef): self.visit(item) return node def visit_Str(self, node): """处理字符串""" # 加密字符串并替换 if node.s not in self.string_mapping: self.string_mapping[node.s] = self.encrypt_string(node.s) encrypted_str = ast.Call( func=ast.Attribute( value=ast.Call( func=ast.Name(id='Fernet', ctx=ast.Load()), args=[ast.Str(s=self.key.decode())], keywords=[] ), attr='decrypt', ctx=ast.Load() ), args=[ast.Call( func=ast.Name(id='base64.b64decode', ctx=ast.Load()), args=[ast.Str(s=self.string_mapping[node.s])], keywords=[] )], keywords=[] ) return ast.Call( func=ast.Attribute(value=encrypted_str, attr='decode', ctx=ast.Load()), args=[], keywords=[] ) def flatten_control_flow(self, node): """扁平化控制流""" if isinstance(node, (ast.If, ast.For, ast.While)): # 添加冗余条件 dummy_condition = ast.Compare( left=ast.Constant(value=random.randint(1, 100)), ops=[ast.Eq()], comparators=[ast.Constant(value=random.randint(1, 100))] ) new_condition = ast.BoolOp( op=ast.Or(), values=[node.test, dummy_condition] ) node.test = new_condition return node def obfuscate(self, source_code): """主混淆函数""" # 解析AST tree = ast.parse(source_code) # 遍历AST并应用混淆 transformer = ast.NodeTransformer() transformer.visit_Assign = self.visit_Assign transformer.visit_FunctionDef = self.visit_FunctionDef transformer.visit_ClassDef = self.visit_ClassDef transformer.visit_Str = self.visit_Str transformer.visit = self.flatten_control_flow obfuscated_tree = transformer.visit(tree) # 添加导入语句 import_nodes = ast.parse("import base64\nfrom cryptography.fernet import Fernet") obfuscated_tree.body = import_nodes.body + obfuscated_tree.body # 生成混淆后的代码 return astor.to_source(obfuscated_tree) def compress_code(self, code): """压缩代码并添加解压执行层""" compressed = zlib.compress(code.encode()) b64_compressed = base64.b64encode(compressed).decode() wrapper = f""" import base64, zlib exec(zlib.decompress(base64.b64decode('{b64_compressed}')).decode()) """ return wrapper if __name__ == "__main__": # 使用示例 input_file = "deepseek_python_20250820_88b63b.py" output_file = "obfuscated_deepseek.py" with open(input_file, "r", encoding="utf-8") as f: source_code = f.read() obfuscator = CodeObfuscator() obfuscated_code = obfuscator.obfuscate(source_code) compressed_code = obfuscator.compress_code(obfuscated_code) with open(output_file, "w", encoding="utf-8") as f: f.write(compressed_code) print(f"Obfuscation complete! Output saved to {output_file}") print(f"Encryption key: {obfuscator.key.decode()} (Keep this secret!)") 发生异常:ModuleNotFoundError× No module named 'astor' File“C:\Users\卓越生活\Desktop\py加密及代码混淆设置工具.py”,line 4,in <modulex import astor ModuleNotFoundError: No module named 'astor'
最新发布
08-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值